Python 中如何列出一个目录下的所有文件?
Python 列出目录文件:os.listdir() 列全部条目、os.scandir() 更高效、pathlib.Path.glob() 按模式匹配、os.walk() 递归遍历。本文对比各种方式。
只列一层:os.listdir(path) 或 Path(path).iterdir();按模式匹配:Path(path).glob('*.py');递归所有子目录:os.walk(path) 或 Path(path).rglob('*')。
os.listdir:列出一层
import os
files = os.listdir('/path/to/dir')
for f in files:
print(f) # 包含文件和子目录名,不含路径前缀
只要文件不要目录:
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
pathlib 方式(推荐)
from pathlib import Path
p = Path('/path/to/dir')
for f in p.iterdir(): # 全部条目
if f.is_file():
print(f.name)
# 按模式匹配
for f in p.glob('*.log'): # 只要 .log 文件
print(f)
for f in p.rglob('*.log'): # 递归所有子目录
print(f)
os.walk:递归遍历
import os
for dirpath, dirnames, filenames in os.walk('/path/to/dir'):
for name in filenames:
print(os.path.join(dirpath, name))
常见问题(FAQ)
Q:listdir 的结果顺序固定吗?
A:不固定(取决于文件系统)。需要排序用 sorted(os.listdir(path))。
Q:glob 支持 ** 递归吗?
A:Path.glob('**/*.py') 中的 ** 表示任意层级子目录,等价于 rglob。
Q:要文件大小、修改时间怎么办?
A:os.scandir() 或 Path.stat():f.stat().st_size(字节)、f.stat().st_mtime(修改时间戳)。