当前位置:首页 > Python > 正文

Python遍历目录树完全指南 - 高效文件处理技巧 | Python教程

Python遍历目录树完全指南

掌握多种方法高效处理文件和文件夹

为什么需要遍历目录树?

在Python开发中,经常需要处理文件和目录,例如:

  • 批量重命名文件
  • 搜索特定类型的文件
  • 统计目录大小
  • 备份项目文件
  • 清理临时文件

掌握高效遍历目录的方法能极大提升文件处理效率。

核心方法介绍

1. 使用os.walk() - 最常用方法

os.walk()是Python标准库中最常用的目录遍历方法,它生成目录树中的文件名。

import os

# 基本用法
for root, dirs, files in os.walk("your_directory"):
    # root: 当前目录路径
    # dirs: 当前目录中的子目录列表
    # files: 当前目录中的文件列表
    for file in files:
        file_path = os.path.join(root, file)
        print(file_path)

高级用法示例:查找所有图片文件

import os

def find_images(directory, extensions=('.jpg', '.png', '.gif')):
    image_files = []
    for root, _, files in os.walk(directory):
        for file in files:
            if file.lower().endswith(extensions):
                image_files.append(os.path.join(root, file))
    return image_files

# 使用示例
images = find_images("/path/to/photos")
print(f"找到 {len(images)} 张图片")

2. 使用pathlib模块 - 面向对象方法

Python 3.4+引入了pathlib模块,提供了面向对象的文件系统路径操作。

from pathlib import Path

# 递归遍历目录
def traverse_with_pathlib(directory):
    path = Path(directory)
    for item in path.rglob('*'):  # rglob递归遍历
        if item.is_file():
            print(f"文件: {item}")
        elif item.is_dir():
            print(f"目录: {item}")

# 使用示例
traverse_with_pathlib("your_directory")

3. 使用glob模块 - 模式匹配

glob模块根据Unix shell规则查找文件路径名,支持递归模式匹配。

import glob

# 查找所有Python文件
python_files = glob.glob("**/*.py", recursive=True)
print("找到的Python文件:")
for file in python_files:
    print(file)

# 查找所有PNG图片
png_files = glob.glob("**/*.png", recursive=True)

实际应用案例

案例1: 目录大小统计

import os

def get_dir_size(directory):
    total_size = 0
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            # 跳过无法访问的文件
            try:
                total_size += os.path.getsize(file_path)
            except OSError:
                continue
    return total_size

# 使用示例
directory = "/path/to/directory"
size_bytes = get_dir_size(directory)
print(f"目录大小: {size_bytes / (1024*1024):.2f} MB")

案例2: 批量重命名文件

import os
import re

def batch_rename(directory, pattern, replacement):
    for root, dirs, files in os.walk(directory):
        for file in files:
            # 使用正则表达式替换文件名
            new_name = re.sub(pattern, replacement, file)
            if new_name != file:
                src = os.path.join(root, file)
                dst = os.path.join(root, new_name)
                # 重命名文件
                os.rename(src, dst)
                print(f"重命名: {file} -> {new_name}")

# 使用示例:将所有文件名中的空格替换为下划线
batch_rename("/path/to/files", r"\s+", "_")

方法对比与选择建议

方法 优点 缺点 适用场景
os.walk() Python标准库,兼容性好,功能强大 API稍显复杂 需要深度遍历和精细控制
pathlib 面向对象,代码优雅,方法链式调用 Python 3.4+,递归遍历可能较慢 现代Python项目,简单路径操作
glob 模式匹配简单直接 功能相对有限 基于模式的文件查找

选择建议:

  • 需要兼容Python旧版本 → 使用os.walk()
  • 使用Python 3.4+且需要现代API → 使用pathlib
  • 只需简单模式匹配 → 使用glob

最佳实践与注意事项

1. 处理符号链接

遍历目录时,默认会跟随符号链接,可能导致无限循环。可以设置followlinks=False来避免。

2. 错误处理

文件系统操作可能遇到权限问题或损坏的符号链接,应添加异常处理:

import os

for root, dirs, files in os.walk(directory):
    for file in files:
        try:
            file_path = os.path.join(root, file)
            # 处理文件
        except PermissionError:
            print(f"权限不足: {file_path}")
            continue
        except OSError as e:
            print(f"系统错误: {e}")
            continue

3. 性能优化

  • 避免在遍历过程中修改目录结构
  • 大目录使用生成器而非列表保存结果
  • 使用os.scandir()替代os.listdir()提高性能

发表评论