Python使用glob匹配文件路径正确却触发FileNotFoundError问题
问题可能成因
- 运行过程中当前工作目录被修改:你使用的是相对路径匹配文件,如果代码遍历过程中调用了
os.chdir()或第三方库隐式修改了当前工作目录,会导致后续相对路径解析错误,出现前面的文件能正常打开、后续文件找不到的情况,这是该场景下最常见的原因。 - 文件名包含隐藏不可见字符:部分文件的文件名可能存在零宽空格、换行符等Unicode控制字符,肉眼观察和正常文件名一致,glob匹配时可正常命中,但系统调用open时无法识别对应路径。
- 文件临时被锁定:如果日志文件同时被杀毒软件、同步工具(如OneDrive、企业内网文档备份程序)占用或锁定,Windows系统会偶发返回文件不存在的错误,而非权限错误。
- 路径分隔符解析异常:glob返回的路径混合了正斜杠和反斜杠,极少数低版本Python在Windows环境下调用原生open接口时会出现路径解析失败的问题。
解决方案
- 统一使用绝对路径操作文件,从根源避免工作目录切换导致的路径解析错误,推荐直接使用pathlib做路径管理,示例代码如下:
from pathlib import Path # 先将Data目录转为绝对路径,resolve()会自动处理相对路径和分隔符问题 DATA_ROOT = Path("../../Data").resolve() # 直接用Path对象的glob方法匹配,返回的都是Path对象而非字符串 DataFiles = list(DATA_ROOT.glob("2021*/*.log")) for file in DataFiles: # 直接调用Path对象的open方法,不需要手动处理路径字符串 with file.open("r", encoding="utf-8") as f: # 原有业务逻辑 pass
- 排查异常文件名的不可见字符,对报错的文件路径打印每个字符的编码值,确认是否存在控制字符:
bad_path = r"../../Data\20210629_081706\20210629_081706_data.log" for idx, c in enumerate(bad_path): print(f"索引{idx}:字符{c},编码{ord(c)}")
如果存在编码小于32的ASCII控制字符,或编码为8203/8204的零宽字符,直接重命名对应文件即可。
3. 增加文件打开重试逻辑,解决偶发的文件锁定问题:
import time MAX_RETRY = 3 RETRY_INTERVAL = 0.2 for file in DataFiles: for retry_cnt in range(MAX_RETRY): try: with open(file, "r") as f: # 原有业务逻辑 pass break except FileNotFoundError: time.sleep(RETRY_INTERVAL) else: print(f"文件打开失败,重试{MAX_RETRY}次仍无响应:{file}")
- 若确认是路径长度超过Windows默认260字符限制导致的问题,可开启Windows系统的长路径支持,或在路径前添加
\\?\前缀处理。
内容的提问来源于stack exchange,提问作者Jerup
相关产品推荐
相关产品推荐

