推荐用 pathlib.Path.rglob() 提取路径,它跨平台、安全、支持递归和类型过滤;glob.glob() 次之,适合简单通配;os.listdir() 不推荐单独使用,需配合 os.path.join() 才可靠。

用 os.listdir() 获取文件名但不推荐用于路径提取
它只返回文件/子目录的**名字**,不带路径,容易在后续拼接时出错(比如忘记加 / 或误用 \)。尤其当脚本不在目标目录下运行时,os.listdir("data") 返回的 "file.txt" 无法直接打开——你得手动补全路径,而跨平台时路径分隔符又是个坑。
实操建议:
- 别单独用
os.listdir()提取完整路径 - 如果非要用,必须配合
os.path.join():os.path.join("data", name) - 注意
os.listdir()不递归,子目录里的文件不会被包含
用 glob.glob() 最快上手,支持通配符
适合明确知道扩展名、且不需要遍历子目录的场景。默认不递归,路径写法直观,Windows/macOS/Linux 都能自动处理分隔符。
实操示例(提取 data/ 下所有 .py 文件):
立即学习“Python免费学习笔记(深入)”;
import glob
paths = glob.glob("data/*.py")
# 输出如:['data/script.py', 'data/utils.py']
常见问题:
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
下载
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 路径末尾没加
/?glob.glob("data*.py")会匹配到datatest.py,不是你想要的 - 要递归查子目录?加
**和recursive=True:glob.glob("data/**/*.py", recursive=True) - 注意
glob不保证顺序,如需排序得手动调sorted(paths)
用 pathlib.Path.rglob() 更现代、更安全
Python 3.4+ 推荐方式,面向对象、链式调用、跨平台路径处理天然可靠,还自带过滤和类型判断能力。
实操示例(提取 data/ 及其所有子目录下的 .txt 和 .log 文件):
from pathlib import Path
p = Path("data")
paths = [str(f) for f in p.rglob("*") if f.is_file() and f.suffix in {".txt", ".log"}]
关键点:
-
rglob("*")等价于递归查找所有项;用is_file()过滤掉目录 -
f.suffix比str(f).endswith(".txt")更准(避免误判archive.txt.bak) - 结果是
Path对象,转字符串统一用str(f),不用自己拼os.sep - 如果只要一级目录,用
p.glob("*")即可
遇到中文路径或特殊字符时报错怎么办
绝大多数情况下不会出错——Python 3 默认用 UTF-8 处理路径,pathlib 和 glob 都已适配。真正容易翻车的是:你在 Windows 上用旧版 Python 2 脚本,或者路径里有