在 Python 文件处理、数据批量读取、目录扫描等场景中,遍历目录是最基础且核心的操作。Python 内置的os模块提供了丰富的文件和目录操作接口,无需额外安装依赖,就能轻松实现目录的深度 / 广度遍历。

本文将从基础用法到实战场景,手把手教你掌握os模块遍历目录的所有技巧,代码可直接复制运行,新手也能快速上手!

一、前置知识:os 模块核心函数

遍历目录前,先熟悉 3 个os模块核心函数,这是后续操作的基础:

表格

函数作用
os.listdir(path)返回指定路径下所有文件和文件夹名称的列表(不递归子目录)
os.path.isdir(path)判断路径是否为目录,返回布尔值
os.path.join(path1, path2)拼接路径,自动适配 Windows/Linux/macOS 系统分隔符
os.walk(top)递归遍历目录,自动生成目录树(最常用的高效遍历方法)

小提示:路径拼接必须用os.path.join(),不要手动写/\,避免跨系统报错!

二、基础遍历:仅遍历当前目录(不递归)

需求:只遍历指定目录下的直接文件和文件夹,不进入子目录。

代码示例

python

运行

import os

# 目标目录(替换为你的实际路径)
target_path = "./test_dir"

# 判断目录是否存在
if not os.path.exists(target_path):
    print(f"错误:目录 {target_path} 不存在!")
else:
    # 遍历当前目录下的所有文件/文件夹
    for name in os.listdir(target_path):
        # 拼接完整路径
        full_path = os.path.join(target_path, name)
        # 判断是文件还是目录
        if os.path.isdir(full_path):
            print(f"【目录】{full_path}")
        else:
            print(f"【文件】{full_path}")

代码解析

  1. os.path.exists():先校验目录是否存在,避免程序报错;
  2. os.listdir():获取当前目录下所有名称;
  3. os.path.join():拼接完整路径,保证路径合法性;
  4. os.path.isdir():区分文件和目录。

三、进阶遍历:递归遍历所有子目录(核心)

实际开发中,我们通常需要遍历目录下所有层级的文件(包括子目录、孙子目录)。这里推荐两种方法:手动递归实现os.walk()高效实现。

方法 1:手动递归(理解原理)

通过函数递归调用,遍历所有子目录:

python

运行

import os

def traverse_dir_recursive(path):
    # 遍历当前目录
    for name in os.listdir(path):
        full_path = os.path.join(path, name)
        # 如果是目录,递归调用自身
        if os.path.isdir(full_path):
            print(f"【目录】{full_path}")
            traverse_dir_recursive(full_path)
        # 如果是文件,直接打印
        else:
            print(f"【文件】{full_path}")

# 调用函数
if __name__ == "__main__":
    target_path = "./test_dir"
    if os.path.exists(target_path):
        traverse_dir_recursive(target_path)
    else:
        print("目录不存在!")

方法 2:os.walk ()(极简高效,推荐)

os.walk()是 Python 专为目录遍历设计的函数,自动递归所有子目录,无需手动写递归逻辑,代码极简!

原理

os.walk(top)会返回一个三元组:(当前目录路径, 当前目录下的子目录列表, 当前目录下的文件列表),循环即可遍历所有内容。

代码示例

python

运行

import os

def traverse_dir_os_walk(path):
    # os.walk 自动递归遍历所有目录
    for root, dirs, files in os.walk(path):
        # 遍历当前目录下的所有子目录
        for dir_name in dirs:
            dir_path = os.path.join(root, dir_name)
            print(f"【目录】{dir_path}")
        # 遍历当前目录下的所有文件
        for file_name in files:
            file_path = os.path.join(root, file_name)
            print(f"【文件】{file_path}")

# 调用函数
if __name__ == "__main__":
    target_path = "./test_dir"
    if os.path.exists(target_path):
        traverse_dir_os_walk(target_path)
    else:
        print("目录不存在!")
优势
  1. 代码量减少 50%,无需递归逻辑;
  2. 稳定性高,官方封装,无递归深度限制;
  3. 直接分离目录和文件,无需手动判断。

四、实战场景:按条件筛选文件

遍历目录的核心用途是筛选指定类型的文件(如批量读取图片、Excel、Python 文件等),下面以「筛选所有.py 文件」为例:

实战代码

python

运行

import os

def find_python_files(path):
    python_files = []
    for root, _, files in os.walk(path):
        for file in files:
            # 筛选后缀为.py的文件
            if file.endswith(".py"):
                file_path = os.path.join(root, file)
                python_files.append(file_path)
    return python_files

# 调用:查找目录下所有Python文件
if __name__ == "__main__":
    target_path = "./"  # 遍历当前项目目录
    py_files = find_python_files(target_path)
    print("=== 找到的Python文件 ===")
    for f in py_files:
        print(f)

扩展

修改endswith()参数即可筛选其他文件:

  • 图片:endswith((".jpg", ".png", ".jpeg"))
  • Excel:endswith((".xlsx", ".xls"))
  • 文本:endswith(".txt")

五、避坑指南(新手必看)

  1. 路径问题:Windows 路径不要用单\(转义字符),推荐:
    • 相对路径:./test_dir
    • 绝对路径:r"C:\Users\test\dir"(加r取消转义)
  2. 权限问题:遍历系统盘(如 C 盘)可能出现权限不足,建议添加异常捕获:

    python

    运行

    try:
        os.listdir(path)
    except PermissionError:
        print(f"无权限访问目录:{path}")
    
  3. 效率问题:超大目录优先用os.walk(),比手动递归快 30% 以上。

六、总结

本文完整讲解了 Python os模块遍历目录的 3 个层级:

  1. 基础遍历os.listdir()仅遍历当前目录;
  2. 递归遍历:手动递归 +os.walk()(推荐)遍历所有子目录;
  3. 实战筛选:按后缀批量筛选目标文件。

os.walk()是日常开发的最优解,代码简洁、跨平台、效率高,建议牢记!

更多推荐