Python文件与目录操作指南
在Python中,文件与目录的操作是日常编程中不可或缺的一部分。Python提供了多个模块来简化这些操作,包括pathlib
、os.path
、fileinput
、stat
、filecmp
、tempfile
、glob
、fnmatch
、linecache
和shutil
等。本文将详细介绍这些模块的使用方法,并通过示例代码帮助你更好地理解它们的功能。
1.1 pathlib —— 面向对象的文件路径操作
pathlib
模块提供了面向对象的文件路径操作方式,相比传统的字符串操作,pathlib
使得路径操作更加直观和易读。
主要功能
pathlib.Path()
: 创建一个指定路径的Path
对象。Path.cwd()
: 返回当前工作目录。Path.home()
: 返回用户的主目录。Path.glob(pattern)
: 返回匹配指定模式的文件生成器。
使用示例
from pathlib import Path
# 创建路径对象
path = Path("my_folder") / "subfolder" / "file.txt"
print(path) # 输出: my_folder/subfolder/file.txt
# 检查文件或目录是否存在
path = Path("example.txt")
if path.exists():
print("文件存在")
else:
print("文件不存在")
# 创建目录
path = Path("new_directory")
path.mkdir(exist_ok=True) # 如果目录已存在,不会抛出错误
# 文件读写
path = Path("sample.txt")
path.write_text("Hello, World!")
content = path.read_text()
print(content) # 输出: Hello, World!
# 获取父目录和扩展名
path = Path("my_folder/subfolder/file.txt")
print(path.parent) # 输出: my_folder/subfolder
print(path.suffix) # 输出: .txt
1.2 os.path —— 路径名操作
os.path
模块提供了操作文件路径的函数,适用于跨平台的文件路径操作。
主要功能
os.path.join(path, *paths)
: 跨平台地拼接路径。os.path.split(path)
: 分割路径为目录和文件名。os.path.exists(path)
: 检查路径是否存在。os.path.normpath(path)
: 规范化路径。os.path.splitext(path)
: 获取文件扩展名。
使用示例
import os
# 路径拼接
path = os.path.join("my_folder", "subfolder", "file.txt")
print(path) # 输出: my_folder/subfolder/file.txt
# 路径分割
dir_name, file_name = os.path.split("my_folder/subfolder/file.txt")
print(dir_name) # 输出: my_folder/subfolder
print(file_name) # 输出: file.txt
# 获取扩展名
root, ext = os.path.splitext("my_folder/subfolder/file.txt")
print(root) # 输出: my_folder/subfolder/file
print(ext) # 输出: .txt
# 路径规范化
normalized_path = os.path.normpath("my_folder//subfolder/../file.txt")
print(normalized_path) # 输出: my_folder/file.txt
# 检查路径是否存在
if os.path.exists("my_folder/subfolder/file.txt"):
print("文件存在")
else:
print("文件不存在")
1.3 fileinput —— 多输入流的行迭代
fileinput
模块用于从多个输入流(如文件或标准输入)中逐行读取数据。
主要功能
fileinput.input(files)
: 依次处理多个文件。fileinput.filename()
: 返回当前处理的文件名。
使用示例
import fileinput
# 从多个文件中读取行
for line in fileinput.input(files=["file1.txt", "file2.txt"]):
print(line.strip())
# 从标准输入读取行
for line in fileinput.input():
print(line.strip())
1.4 stat —— 文件状态信息
stat
模块用于获取文件或目录的状态信息,并解析这些信息。
主要功能
os.stat(path)
: 获取文件或目录的状态信息。os.lstat(path)
: 获取符号链接本身的状态信息。
使用示例
import os
import stat
# 获取文件状态信息
file_info = os.stat('example.txt')
print(f"文件大小: {file_info.st_size} 字节")
print(f"最后修改时间: {file_info.st_mtime}")
# 检查文件类型
if stat.S_ISDIR(file_info.st_mode):
print("这是一个目录")
elif stat.S_ISREG(file_info.st_mode):
print("这是一个普通文件")
1.5 filecmp —— 文件与目录的比较
filecmp
模块用于比较文件和目录的内容。
主要功能
filecmp.cmp(file1, file2)
: 比较两个文件是否相同。filecmp.dircmp(dir1, dir2)
: 比较两个目录的内容。
使用示例
import filecmp
# 比较两个文件
result = filecmp.cmp('file1.txt', 'file2.txt')
print(result) # True 表示文件相同,False 表示不同
# 比较两个目录
dir_cmp = filecmp.dircmp('dir1', 'dir2')
print(f"共同文件: {dir_cmp.common_files}")
print(f"不同文件: {dir_cmp.diff_files}")
1.6 tempfile —— 临时文件与目录的创建
tempfile
模块用于创建临时文件和目录,程序结束后会自动删除这些临时文件。
主要功能
tempfile.TemporaryFile()
: 创建临时文件。tempfile.NamedTemporaryFile()
: 创建命名临时文件。tempfile.TemporaryDirectory()
: 创建临时目录。
使用示例
import tempfile
# 创建临时文件
with tempfile.TemporaryFile(mode='w+t') as temp_file:
temp_file.write("这是一个临时文件")
temp_file.seek(0)
print(temp_file.read())
# 创建临时目录
with tempfile.TemporaryDirectory() as temp_dir:
print(f"临时目录创建在 {temp_dir}")
1.7 glob —— 路径名的模式匹配
glob
模块用于匹配文件路径名,支持通配符。
主要功能
glob.glob(pathname)
: 返回匹配指定模式的文件列表。glob.iglob(pathname)
: 返回匹配指定模式的文件迭代器。
使用示例
import glob
# 匹配当前目录下的所有.txt文件
text_files = glob.glob('*.txt')
print(text_files)
# 递归匹配所有.py文件
python_files = glob.glob('**/*.py', recursive=True)
print(python_files)
1.8 fnmatch —— Unix文件名模式匹配
fnmatch
模块用于Unix风格的文件名模式匹配。
主要功能
fnmatch.fnmatch(filename, pattern)
: 检查文件名是否匹配指定模式。fnmatch.filter(names, pattern)
: 过滤匹配模式的文件名。
使用示例
import fnmatch
# 检查文件名是否匹配模式
print(fnmatch.fnmatch('file1.txt', '*.txt')) # True
# 过滤匹配模式的文件名
files = ['data1.txt', 'data2.csv', 'notes.txt']
txt_files = fnmatch.filter(files, '*.txt')
print(txt_files) # ['data1.txt', 'notes.txt']
1.9 linecache —— 文本行的随机访问
linecache
模块用于随机访问文本文件的特定行。
主要功能
linecache.getline(filename, lineno)
: 返回指定文件的指定行。linecache.getlines(filename)
: 返回指定文件的所有行。
使用示例
import linecache
# 获取文件的第三行
line = linecache.getline('example.txt', 3)
print(line)
# 获取文件的所有行
lines = linecache.getlines('example.txt')
for line in lines:
print(line, end='')
1.10 shutil —— 高级文件操作
shutil
模块提供了高级的文件操作功能,如复制、移动、删除、压缩等。
主要功能
shutil.copy(src, dst)
: 复制文件。shutil.move(src, dst)
: 移动文件或目录。shutil.rmtree(path)
: 删除目录及其内容。shutil.make_archive()
: 创建压缩文件。shutil.unpack_archive()
: 解压文件。
使用示例
import shutil
# 复制文件
shutil.copy('source.txt', 'destination.txt')
# 移动文件
shutil.move('source.txt', 'new_folder/destination.txt')
# 删除目录
shutil.rmtree('unnecessary_directory')
# 创建压缩文件
shutil.make_archive('archive_name', 'zip', 'folder_to_compress')
# 解压文件
shutil.unpack_archive('archive_name.zip', 'destination_folder')