glob.glob('.txt')找不到文件是因为反斜杠被转义且默认不递归;正确写法是glob.glob('.txt')查当前目录,或glob.glob('*/.txt', recursive=true)递归查找。

glob.glob('*\.txt') 为什么找不到文件?
因为 glob.glob() 默认只在当前目录搜索,且反斜杠 \ 在 Python 字符串里是转义符——写成 '*\.txt' 实际传给 glob 的是 *.txt(点被当普通字符),根本不是通配后缀的意图。
正确做法是用正斜杠或原始字符串,且明确路径范围:
- 查当前目录:用
glob.glob('*.txt')(不需要反斜杠) - 查子目录:用
glob.glob('**/*.txt', recursive=True) - 绝对安全写法:用原始字符串
r'*.txt'避免转义干扰
递归查找所有 .txt 文件要加 recursive=True
glob.glob() 默认不进子目录,哪怕你写了 '**/*.txt',没开 recursive=True 就完全不生效,也不会报错——这是最常踩的静默坑。
示例对比:
立即学习“Python免费学习笔记(深入)”;
import glob
glob.glob('**/*.txt') # 返回空列表
glob.glob('**/*.txt', recursive=True) # 才真递归查找- Windows 和 macOS/Linux 行为一致,不用额外适配路径分隔符
- 如果路径含中文或空格,
glob能正常处理,无需额外编码转换 - 性能上,递归遍历大量小文件时比
os.walk()略慢,但代码更简洁
想排除某些目录(比如 __pycache__)怎么办?
glob 本身不支持排除模式,硬加 !__pycache__ 会直接报错:SyntaxError: unexpected character after line continuation character。
务实解法是「先查再筛」:
- 用
glob.glob('**/*.txt', recursive=True)拿到全量结果 - 用
pathlib.Path或os.path过滤路径:[p for p in paths if '__pycache__' not in p] - 或者改用
pathlib.Path.rglob()+filter,可读性更好:[p for p in Path('.').rglob('*.txt') if 'cache' not in str(p)]
glob 和 pathlib.Path.rglob 哪个更推荐?
新项目优先用 pathlib,它返回 Path 对象,后续操作(读取、删除、获取父目录)不用反复拼字符串;glob 返回纯字符串,容易在路径处理环节出错。
但注意兼容性:
-
pathlib在 Python 3.4+ 原生支持,3.3 及以下必须装pathlib2 -
glob胜在轻量、无依赖,适合脚本快速原型或嵌入式环境 - 两者对符号链接的处理默认都是“跟随”,如需跳过,得手动检查
.is_symlink()
实际写业务逻辑时,一旦涉及路径拼接、存在性判断或批量操作,Path 的链式调用几乎不会出错,而字符串拼 os.path.join() 容易漏掉斜杠或混用正反斜杠。










