Python 实战:os 模块高效遍历目录全攻略(新手必看)
·
在 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}")
代码解析
os.path.exists():先校验目录是否存在,避免程序报错;os.listdir():获取当前目录下所有名称;os.path.join():拼接完整路径,保证路径合法性;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("目录不存在!")
优势
- 代码量减少 50%,无需递归逻辑;
- 稳定性高,官方封装,无递归深度限制;
- 直接分离目录和文件,无需手动判断。
四、实战场景:按条件筛选文件
遍历目录的核心用途是筛选指定类型的文件(如批量读取图片、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")
五、避坑指南(新手必看)
- 路径问题:Windows 路径不要用单
\(转义字符),推荐:- 相对路径:
./test_dir - 绝对路径:
r"C:\Users\test\dir"(加r取消转义)
- 相对路径:
- 权限问题:遍历系统盘(如 C 盘)可能出现权限不足,建议添加异常捕获:
python
运行
try: os.listdir(path) except PermissionError: print(f"无权限访问目录:{path}") - 效率问题:超大目录优先用
os.walk(),比手动递归快 30% 以上。
六、总结
本文完整讲解了 Python os模块遍历目录的 3 个层级:
- 基础遍历:
os.listdir()仅遍历当前目录; - 递归遍历:手动递归 +
os.walk()(推荐)遍历所有子目录; - 实战筛选:按后缀批量筛选目标文件。
os.walk()是日常开发的最优解,代码简洁、跨平台、效率高,建议牢记!
更多推荐
所有评论(0)