处理文件的另一个重要方面是文件路径和文件系统操作。Python 提供了多个模块用于操作文件系统,其中最常用的是
os
模块和pathlib
模块。掌握这些工具,能够让你在自动化任务中更轻松地管理文件和目录。
1 文件路径的基本操作
在操作文件时,路径是一个至关重要的概念。文件路径可以是绝对路径或相对路径:
- 绝对路径:从根目录开始的完整路径。
- 相对路径:相对于当前工作目录的路径。
1.1 os.path
模块
os.path
模块包含了一系列用于操作路径的方法。下面是一些常用的方法:
python
import os
# 获取当前文件的绝对路径
current_file_path = os.path.abspath('example.txt')
print("绝对路径:", current_file_path)
# 获取文件所在的目录
directory = os.path.dirname(current_file_path)
print("文件目录:", directory)
# 获取文件的基本名(不含目录部分)
basename = os.path.basename(current_file_path)
print("文件名:", basename)
# 分离文件名和扩展名
file_name, file_extension = os.path.splitext(current_file_path)
print("文件名:", file_name)
print("扩展名:", file_extension)
解释:
os.path.abspath()
:将相对路径转换为绝对路径。os.path.dirname()
:返回路径中的目录部分。os.path.basename()
:返回路径中的文件名部分。os.path.splitext()
:将文件名和扩展名分开。
1.2 pathlib
模块
pathlib
模块提供了更现代、更面向对象的方式来操作路径。相比 os.path
,pathlib
更加直观且易用。
python
from pathlib import Path
# 创建一个 Path 对象
file_path = Path('example.txt')
# 获取绝对路径
absolute_path = file_path.resolve()
print("绝对路径:", absolute_path)
# 获取文件所在的目录
directory = file_path.parent
print("文件目录:", directory)
# 获取文件的基本名和扩展名
print("文件名:", file_path.stem)
print("扩展名:", file_path.suffix)
说明:
Path
对象可以更自然地表示文件路径,提供的方法如.stem
、.suffix
、.parent
能简化文件路径的操作。
2 操作文件和目录
Python 提供了丰富的文件和目录操作方法,涵盖创建、删除、重命名和遍历文件等功能。
2.1 创建文件和目录
要创建文件,可以直接使用文件操作模式,如 'w'
。如果要创建目录,可以使用 os.makedirs()
或 pathlib.Path.mkdir()
方法。
python
# 创建文件
with open('new_file.txt', 'w') as file:
file.write("这是新创建的文件。")
# 创建目录(os模块)
os.makedirs('new_folder/sub_folder', exist_ok=True)
print("目录已创建")
# 创建目录(pathlib模块)
Path('new_folder/sub_folder').mkdir(parents=True, exist_ok=True)
print("目录已使用 pathlib 创建")
解释:
os.makedirs()
:递归创建目录。如果exist_ok=True
,当目录已存在时不会引发错误。Path.mkdir()
:创建目录,与os.makedirs()
类似。
2.2 删除文件和目录
要删除文件和目录,os
和 pathlib
提供了不同的方法:
python
# 删除文件
os.remove('new_file.txt')
print("文件已删除")
# 删除空目录
os.rmdir('new_folder/sub_folder')
print("空目录已删除")
# 使用 pathlib 删除文件和目录
Path('new_folder/sub_folder').rmdir()
print("pathlib 删除目录")
注意:
os.remove()
和Path.unlink()
可以删除文件。os.rmdir()
和Path.rmdir()
只能删除空目录。
如果要删除非空目录,可以使用 shutil.rmtree()
:
python
import shutil
# 删除非空目录
shutil.rmtree('new_folder')
print("非空目录已删除")
3 文件遍历
在许多情况下,你可能需要遍历某个目录下的所有文件或子目录,Python 提供了多种方式来遍历目录。
3.1 使用 os.listdir()
os.listdir()
函数可以列出指定目录下的所有文件和子目录:
python
# 列出目录中的文件和子目录
items = os.listdir('.')
print("当前目录中的项目:", items)
3.2 使用 os.walk()
os.walk()
函数用于递归遍历目录树。它会生成一个三元组 (dirpath, dirnames, filenames)
,分别表示当前目录路径、该目录下的子目录和文件名。
python
# 递归遍历目录树
for dirpath, dirnames, filenames in os.walk('.'):
print("目录路径:", dirpath)
print("子目录:", dirnames)
print("文件:", filenames)
说明:
os.walk()
非常适合用于遍历复杂的目录结构,尤其是当需要递归处理所有文件时。
3.3 使用 pathlib
遍历
pathlib
提供了 .iterdir()
、.glob()
和 .rglob()
方法来遍历目录,支持模式匹配。
python
# 使用 iterdir() 列出目录中的文件和子目录
path = Path('.')
for item in path.iterdir():
print(item)
# 使用 glob() 列出所有 .txt 文件
for txt_file in path.glob('*.txt'):
print(txt_file)
# 使用 rglob() 递归查找所有 .py 文件
for py_file in path.rglob('*.py'):
print(py_file)
说明:
.glob()
支持使用通配符匹配文件,如*.txt
匹配所有.txt
文件。.rglob()
递归遍历目录树,查找所有匹配的文件。
4 获取文件和目录信息
有时你需要获取文件的详细信息,比如文件大小、修改时间等。os
模块和 pathlib
模块都提供了相应的方法。
1 获取文件大小和修改时间
python
# 使用 os 获取文件大小和修改时间
file_size = os.path.getsize('example.txt')
file_mtime = os.path.getmtime('example.txt')
print(f"文件大小: {file_size} 字节")
print(f"文件最后修改时间: {file_mtime}")
# 使用 pathlib 获取文件大小和修改时间
file_path = Path('example.txt')
print(f"文件大小: {file_path.stat().st_size} 字节")
print(f"文件最后修改时间: {file_path.stat().st_mtime}")
2 检查文件类型和权限
可以通过 os.path
或 pathlib
来检查文件或目录的类型,以及是否具有某些权限。
python
# 检查是否是文件
is_file = os.path.isfile('example.txt')
print("是文件:", is_file)
# 检查是否是目录
is_dir = os.path.isdir('example_folder')
print("是目录:", is_dir)
# 使用 pathlib 检查类型
path = Path('example.txt')
print("是文件:", path.is_file())
print("是目录:", path.is_dir())
说明:
os.path.isfile()
和Path.is_file()
用于检查路径是否是文件。os.path.isdir()
和Path.is_dir()
用于检查路径是否是目录。
5 文件权限管理
Python 可以操作文件和目录的权限,常用的函数有 os.chmod()
和 pathlib.Path.chmod()
,可以修改文件的读、写、执行权限。
python
import os
# 设置文件为只读
os.chmod('example.txt', 0o444)
# 使用 pathlib 设置文件为可读写
Path('example.txt').chmod(0o644)
说明:
- 文件权限使用八进制表示法,如
0o644
表示文件拥有者可以读写,其他用户只能读取。