在 Python 中,获取文件夹下的所有文件(包括子文件夹中的文件)有多种方法,下面我将为你介绍几种最常用和最实用的方法,从简单到强大,并附上详细的代码示例和解释。

使用 os.listdir() (基础方法)
这是最基础的方法,可以获取指定目录下的所有条目(包括文件和文件夹)。
特点:
- 简单直接。
- 不包括子文件夹中的文件。
- 需要手动区分文件和文件夹。
代码示例:
import os
# 指定要遍历的文件夹路径
folder_path = 'your_folder_path' # 请替换成你的文件夹路径
# 检查路径是否存在
if not os.path.exists(folder_path):
print(f"路径 '{folder_path}' 不存在。")
else:
# 获取文件夹下的所有条目
entries = os.listdir(folder_path)
print(f"文件夹 '{folder_path}' 下的内容:")
for entry in entries:
# 打印每个条目的名称
print(entry)
# 如果需要区分文件和文件夹
full_path = os.path.join(folder_path, entry)
if os.path.isfile(full_path):
print(f" -> 是文件: {entry}")
elif os.path.isdir(full_path):
print(f" -> 是文件夹: {entry}")
使用 os.walk() (推荐,功能强大)
os.walk() 是 Python 中遍历目录树的“利器”,它会递归地遍历指定目录下的所有子目录和文件。

特点:
- 递归遍历:会自动进入所有子文件夹。
- 返回一个生成器,非常节省内存,适合处理大型目录结构。
- 返回的每个元素是一个三元组
(root, dirs, files):root: 当前正在遍历的文件夹路径。dirs: 该文件夹下包含的子文件夹列表。files: 该文件夹下包含的文件列表。
代码示例 1:打印所有文件的完整路径
import os
# 指定要遍历的文件夹路径
folder_path = 'your_folder_path' # 请替换成你的文件夹路径
print(f"正在查找文件夹 '{folder_path}' 及其子文件夹中的所有文件...")
# os.walk 会递归遍历所有子目录
for root, dirs, files in os.walk(folder_path):
for file in files:
# 拼接出文件的完整路径
file_path = os.path.join(root, file)
print(file_path)
代码示例 2:将所有文件路径存入列表
import os
folder_path = 'your_folder_path'
all_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
all_files.append(file_path)
print("找到的所有文件路径列表:")
for path in all_files:
print(path)
使用 pathlib (现代、面向对象的方法)
Python 3.4+ 引入了 pathlib 模块,它提供了一种更现代、更直观的面向对象的方式来处理文件系统路径,这是目前最推荐的方法,代码更简洁、易读。

特点:
- 面向对象,代码更清晰。
- 方法名(如
.iterdir(),.glob(),.rglob())非常直观。 - 跨平台性好。
代码示例 1:使用 Path.rglob() 递归查找所有文件
Path.rglob('pattern') 会递归地在当前目录及其所有子目录中查找匹配 pattern 的文件。 是一个通配符,代表任意名称。
from pathlib import Path
# 指定要遍历的文件夹路径
folder_path = Path('your_folder_path') # 请替换成你的文件夹路径
# 检查路径是否存在
if not folder_path.is_dir():
print(f"路径 '{folder_path}' 不是一个文件夹或不存在。")
else:
# rglob('*') 会递归查找所有文件
# p 是一个 Path 对象,可以使用 .as_posix() 或 str() 转换为字符串
all_files = [p for p in folder_path.rglob('*') if p.is_file()]
print("找到的所有文件:")
for file_path in all_files:
# 打印文件的完整路径字符串
print(file_path)
代码示例 2:使用 Path.glob() 查找特定类型的文件
如果你想查找特定扩展名的文件(例如所有 .txt 文件),pathlib 非常方便。
from pathlib import Path
folder_path = Path('your_folder_path')
# 查找所有 .txt 文件
# '**/' 表示在任意层级的子目录中查找
txt_files = folder_path.rglob('**/*.txt')
print("找到的所有 .txt 文件:")
for file_path in txt_files:
print(file_path)
总结与对比
| 方法 | 核心函数 | 特点 | 适用场景 |
|---|---|---|---|
os.listdir() |
os.listdir() |
基础,只获取一级目录内容,需手动处理子目录。 | 只需要查看当前文件夹下的文件,不关心子目录时。 |
os.walk() |
os.walk() |
递归遍历,返回生成器,内存效率高,功能强大。 | 最常用,需要递归获取文件夹下所有文件时,是经典且可靠的选择。 |
pathlib |
Path.rglob() |
现代、推荐,面向对象,代码简洁易读。 | 强烈推荐,特别是对于新项目,代码更优雅,功能也更丰富(如轻松处理文件扩展名、路径拼接等)。 |
如何选择?
- 新手或简单任务:如果只是简单地获取一个文件夹下的文件,不涉及子目录,
os.listdir()足够。 - 需要递归查找所有文件:如果你需要获取一个文件夹及其所有子文件夹中的文件,
os.walk()是最经典、最通用的选择,兼容性好。 - 新项目或追求代码优雅:强烈推荐使用
pathlib,它的 API 设计更符合 Python 的哲学,代码可读性更高,是处理文件路径的未来趋势,对于大多数现代 Python 这是最佳选择。
