思路
- 使用生成器:由于目录树可能非常大,使用生成器可以逐一生成文件路径,而不是一次性加载所有路径到内存中,从而避免内存溢出问题。
- 异常处理:在遍历过程中,可能会遇到权限不足、文件损坏等异常。可以使用
try - except
语句来捕获并处理这些异常。
- 性能优化:使用
os.walk
函数可以高效地遍历目录树。os.walk
会以深度优先的方式遍历目录树,并且在遍历过程中会生成每个目录下的文件和子目录列表,减少内存占用。
核心代码示例
import os
def process_files(directory):
for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
try:
# 打开文件读取文件头判断文件类型,这里以简单读取前几个字节模拟
with open(file_path, 'rb') as f:
file_header = f.read(4)
# 这里可以根据不同文件类型的文件头特征判断文件类型
# 例如:if file_header.startswith(b'\x89PNG\r\n\x1a\n'): 表示是PNG图片
print(f"Processing {file_path}, file header: {file_header}")
except PermissionError:
print(f"Permission denied for {file_path}")
except OSError as e:
print(f"Error processing {file_path}: {e}")
if __name__ == "__main__":
target_directory = '.'
process_files(target_directory)
代码说明
process_files
函数:
- 使用
os.walk
遍历指定目录directory
。
- 对于每个文件,使用
os.path.join
拼接完整的文件路径。
- 使用
try - except
块处理可能出现的异常,PermissionError
捕获权限不足的异常,OSError
捕获其他文件操作相关的异常(如文件损坏等)。
- 在
try
块中,以二进制模式打开文件读取前4个字节作为文件头示例,实际应用中可以根据不同文件类型的文件头特征判断文件类型。
if __name__ == "__main__"
:调用process_files
函数,这里以当前目录'.'
作为示例目录,可以根据实际需求修改为目标目录路径。