You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用glob匹配文件路径正确却触发FileNotFoundError问题

问题可能成因
  • 运行过程中当前工作目录被修改:你使用的是相对路径匹配文件,如果代码遍历过程中调用了os.chdir()或第三方库隐式修改了当前工作目录,会导致后续相对路径解析错误,出现前面的文件能正常打开、后续文件找不到的情况,这是该场景下最常见的原因。
  • 文件名包含隐藏不可见字符:部分文件的文件名可能存在零宽空格、换行符等Unicode控制字符,肉眼观察和正常文件名一致,glob匹配时可正常命中,但系统调用open时无法识别对应路径。
  • 文件临时被锁定:如果日志文件同时被杀毒软件、同步工具(如OneDrive、企业内网文档备份程序)占用或锁定,Windows系统会偶发返回文件不存在的错误,而非权限错误。
  • 路径分隔符解析异常:glob返回的路径混合了正斜杠和反斜杠,极少数低版本Python在Windows环境下调用原生open接口时会出现路径解析失败的问题。
解决方案
  1. 统一使用绝对路径操作文件,从根源避免工作目录切换导致的路径解析错误,推荐直接使用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
  1. 排查异常文件名的不可见字符,对报错的文件路径打印每个字符的编码值,确认是否存在控制字符:
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}")
  1. 若确认是路径长度超过Windows默认260字符限制导致的问题,可开启Windows系统的长路径支持,或在路径前添加\\?\前缀处理。

内容的提问来源于stack exchange,提问作者Jerup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:06:03