Python自动化:如何遍历并处理目录中的文件

需要处理目录下所有文件?Python的os模块和pathlib模块能帮你轻松实现目录遍历,支持递归处理子目录,让文件处理更智能。

468 × 60 文章顶部广告 QEG44JER

引言 / 什么是目录遍历自动化

在日常开发或数据处理任务中,我们经常需要批量处理某个目录下的所有文件,例如批量重命名、格式转换或内容分析。传统手动操作不仅效率低下,还容易出错。Python凭借其强大的文件系统操作能力,通过ospathlib模块提供了多种目录遍历方案,可轻松实现自动化文件处理。

本文将系统讲解Python目录遍历的核心方法,包括:

  • 基础遍历:os.listdir()os.scandir()
  • 递归遍历:os.walk()深度解析
  • 现代方案:pathlib模块的优雅实现
  • 实战案例:批量处理文件扩展名

准备工作

确保已安装Python 3.6+环境(推荐3.8+),无需额外安装库。测试环境建议准备一个包含多级子目录和多种文件类型的测试文件夹。

基础遍历方法

方法一:os.listdir() 快速获取文件列表

最基础的目录遍历方法,返回指定路径下的所有文件和子目录名(不包含路径信息):

import os

dir_path = './test_folder'
for item in os.listdir(dir_path):
    full_path = os.path.join(dir_path, item)
    if os.path.isfile(full_path):
        print(f"文件: {full_path}")
    elif os.path.isdir(full_path):
        print(f"目录: {full_path}")

特点

  • 简单直接,适合单层目录
  • 需手动拼接完整路径
  • 无法直接区分文件/目录类型

方法二:os.scandir() 高效遍历(推荐)

Python 3.5+引入的改进方法,返回DirEntry对象,包含文件元信息:

with os.scandir('./test_folder') as entries:
    for entry in entries:
        if entry.is_file():
            print(f"文件: {entry.name} (大小: {entry.stat().st_size/1024:.1f}KB)")
        elif entry.is_dir():
            print(f"目录: {entry.name}")

优势

  • 性能比listdir()提升30%-50%
  • 直接获取文件类型和元数据
  • 支持上下文管理器自动关闭资源

递归遍历子目录:os.walk()详解

当需要处理嵌套子目录时,os.walk()是最强大的工具:

for root, dirs, files in os.walk('./test_folder'):
    print(f"\n当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件列表:")
    
    for file in files:
        file_path = os.path.join(root, file)
        print(f" - {file_path}")
        # 在此处添加文件处理逻辑

参数说明

  • topdown=True(默认):从上到下遍历
  • onerror=None:错误处理回调
  • followlinks=False:是否跟踪符号链接

典型应用场景

  • 批量搜索特定文件
  • 递归删除空目录
  • 构建文件树结构

现代方案:pathlib模块(Python 3.4+)

面向对象的文件系统操作,代码更简洁易读:

from pathlib import Path

# 遍历所有文件(不包含子目录)
for file in Path('./test_folder').iterdir():
    if file.is_file():
        print(file.name)

# 递归遍历所有.txt文件
for txt_file in Path('./test_folder').rglob('*.txt'):
    print(f"找到文本文件: {txt_file}")
    # 处理文件内容
    with open(txt_file, 'r', encoding='utf-8') as f:
        content = f.read()

核心方法对比

方法 递归支持 性能 代码简洁度 适用场景
os.listdir() ⭐⭐ 单层目录快速遍历
os.scandir() ⭐⭐⭐⭐ ⭐⭐ 需要元信息的单层遍历
os.walk() ⭐⭐⭐ ⭐⭐ 复杂目录结构处理
pathlib.rglob() ⭐⭐⭐⭐ ⭐⭐⭐⭐ 现代Python项目首选

进阶技巧

技巧1:按文件属性过滤

# 查找大于1MB的.jpg文件
from pathlib import Path

for img in Path('./photos').rglob('*.jpg'):
    if img.stat().st_size > 1024*1024:
        print(f"大图: {img.name} ({img.stat().st_size/1024/1024:.1f}MB)")

技巧2:批量修改文件扩展名

import os
from pathlib import Path

source_dir = './documents'
for file in Path(source_dir).glob('*.doc'):
    new_file = file.with_stem(file.stem + '_backup').with_suffix('.docx')
    file.rename(new_file)
    print(f"重命名: {file} → {new_file}")

技巧3:并行处理文件(使用concurrent.futures

import os
from concurrent.futures import ThreadPoolExecutor

def process_file(file_path):
    # 模拟耗时操作
    with open(file_path, 'r') as f:
        content = f.read().upper()
    with open(file_path, 'w') as f:
        f.write(content)

files_to_process = [os.path.join(root, f) 
                   for root, _, files in os.walk('./large_folder') 
                   for f in files if f.endswith('.txt')]

with ThreadPoolExecutor(max_workers=8) as executor:
    executor.map(process_file, files_to_process)

常见问题

Q:如何处理中文文件名乱码问题?

A:始终使用encoding='utf-8'参数打开文件,在Windows系统可能需要额外处理编码:

with open('中文文件.txt', 'r', encoding='utf-8-sig') as f:
    content = f.read()

Q:os.walk()pathlib.rglob()性能差异大吗?

A:在简单场景下性能接近,但pathlib在以下情况更优:

  • 需要频繁拼接路径时
  • 代码可读性要求高时
  • 使用现代Python特性(如类型提示)时

Q:如何跳过某些目录(如.git)?

A:在os.walk()中修改dirs列表:

for root, dirs, files in os.walk('./project'):
    dirs[:] = [d for d in dirs if not d.startswith('.')]
    # 处理文件...

使用pathlib时需手动过滤:

for path in Path('./project').rglob('*'):
    if path.is_dir() and path.name.startswith('.'):
        continue
    # 处理文件...

小结

Python提供了多种目录遍历方案,从基础的os.listdir()到现代化的pathlib,开发者应根据具体需求选择:

  • 简单任务:os.scandir()
  • 复杂目录结构:os.walk()
  • 现代项目:pathlib

掌握这些方法后,可以轻松实现:

  • 批量文件重命名
  • 自动化格式转换
  • 日志文件分析
  • 多媒体文件整理

建议从pathlib开始实践,逐步掌握更复杂的文件操作模式。完整示例代码可在本文配套GitHub仓库获取。

468 × 60 文章底部广告 7XM2LNHL

💡 推荐阅读

Python 文件自动化处理:批量重命名技巧

还在为大量文件重命名烦恼?本文教你用Python轻松实现批量重命名,支持正则表达式、自定义规则,让文件管理更高效。

Python文件比较:自动化检测差异内容

需要比较两个文件差异?Python的filecmp和difflib模块能帮你实现自动化文件比较,支持文本和二进制文件,适合版本控制、数据校验等场景。

Python文件监控:实时检测目录变化

需要实时监控目录变化?Python的watchdog库能帮你实现文件创建、修改、删除的实时检测,适合自动化备份、日志分析等场景。

剪映模板素材哪里找?优质资源推荐

想要找到优质的剪映模板素材?本文为你推荐几个可靠的资源网站,让你轻松获取丰富多样的模板素材,提升视频制作水平。

手机进水后如何紧急处理?5步自救指南

手机意外落水别慌!掌握这5个紧急处理步骤,能大幅降低手机损坏风险,甚至可能让手机恢复如初。快来学习正确的自救方法吧!

Android通知历史记录:轻松回顾错过的消息

错过重要消息?Android通知历史记录来帮你!本文教你如何查看和管理通知历史记录,不再错过任何重要信息。

手机充电显示异常?解读与修复指南

手机充电时显示异常?本文解读常见显示问题,如不显示充电、电量跳变等,并提供修复方法,让你的手机充电显示恢复正常。

手机摄影专业模式全解析:轻松拍出大片感

手机摄影专业模式功能强大,但很多人不知如何使用。本文将详细介绍专业模式各项参数,从基础到进阶,让你快速上手,轻松拍出具有大片感的照片,提升摄影水平。

批量打印入门:如何快速设置打印任务?

批量打印能大幅提升效率,但设置起来却让不少人头疼。本文将带你从零开始,学习如何快速设置打印任务,掌握基础技巧,让打印变得轻松又高效。

WPS演示图表制作技巧:数据可视化轻松搞定

数据太多难以呈现?本文将教你如何使用WPS演示制作图表,将复杂数据转化为直观图表,让观众一眼看懂数据背后的故事,提升演示说服力。

电脑开机无反应?5步排查法轻松解决

电脑按下电源键却毫无反应?别慌!本文教你5步排查法,从电源、主板到内存,逐步定位问题根源,轻松解决开机无反应的难题。

手机夜景拍摄全攻略:轻松拍出璀璨夜色

夜景拍摄是手机摄影的难点,但掌握技巧后也能拍出惊艳作品。本文将分享手机夜景拍摄的参数设置、构图技巧及实用小工具,助你轻松捕捉城市夜晚的璀璨与静谧。

剪映转场效果:如何让视频过渡更自然?

剪映转场效果大揭秘!本文将教你如何为视频添加转场效果,并调整转场的时长、方向等参数,让你的视频过渡更加自然流畅。

iOS系统设置:如何快速关闭后台应用刷新?

后台应用刷新会悄悄消耗电量和流量,其实iOS系统设置里就能轻松关闭。本文将教你一步步操作,还能了解关闭后的影响,让你的iPhone更省电!

Excel动态图表制作指南:用控件实现数据联动

通过表单控件与动态公式结合,教你创建可交互的销售分析仪表盘,让数据随选择自动更新变化。

OBS 录屏软件安装全攻略:零基础快速上手

还在为 OBS 安装问题发愁?本文将详细介绍 OBS 录屏软件在 Windows、Mac 系统上的安装步骤,以及安装过程中的常见问题及解决方法,让你轻松开启录屏之旅。

Excel打印高级技巧:如何打印网格线和批注?

打印Excel表格时,如何打印网格线和批注?本文教你使用Excel的高级打印设置,轻松实现网格线和批注的打印。

OneNote与Outlook联动:任务管理新玩法

OneNote不仅能记笔记,还能与Outlook联动管理任务!本文教你如何将笔记转化为任务,并设置提醒,让工作学习更有条理。

AE预设应用指南:快速打造专业级视频

想要快速打造专业级视频?AE预设应用来帮你!本文将详细介绍AE预设的使用方法,让你轻松应用各种预设效果,提升视频质量。

机箱风道设计:优化散热,提升电脑性能

合理的机箱风道设计能显著提升电脑散热效果。本文将教你如何优化机箱风道,让电脑硬件在更佳的环境下运行,提升整体性能。