为何glob.glob可匹配到文件但open与np.load无法读取该文件?
问题排查与解决方案
核心原因
该问题本质是路径不一致导致的,glob.glob()能匹配到文件说明目标文件确实存在,open()、np.load()报错是因为传入的路径和实际文件路径存在你感知不到的差异,或者Python运行环境与终端的文件系统视图不一致。
解决步骤
- 第一步:直接使用
glob返回的路径读取文件
你手动输入的路径可能混入了不可见字符(比如零宽空格、特殊换行符、多余的不可见空白),glob的模糊匹配逻辑能识别到实际存在的文件,但是原路径传入open()时无法定位到文件,直接使用glob返回的路径即可:
import glob import numpy as np target_path = '/data00/home/zhangbowen.17/code/text_rec/dataset/BigAndSmallDataset/cut_100_big_user_video_500_mine_precomp/train_cnn_fea.npy' matched_files = glob.glob(target_path) if matched_files: real_file_path = matched_files[0] # 读取npy文件直接传入路径即可 data = np.load(real_file_path)
- 第二步:确认路径是否完全一致
如果上一步依然报错,对比你手动定义的路径和glob返回的路径的字符编码,确认是否存在不可见字符:
# 打印两个路径的每个字符的ASCII/Unicode编码 print("自定义路径字符编码:", [ord(c) for c in target_path]) print("glob返回路径字符编码:", [ord(c) for c in real_file_path]) # 直接对比路径是否完全相等 print("路径是否完全一致:", target_path == real_file_path)
如果返回结果为False,删除原路径重新手动输入,或者直接复制glob返回的路径使用即可。
- 第三步:排查运行环境的文件系统差异
如果路径完全一致依然报错,说明你运行Python的环境和执行ls命令的终端环境的文件系统视图不一致:- 如果你在Docker容器、WSL、虚拟chroot环境中运行Python,确认目标路径是否已经正确挂载到Python运行环境中
- 可以在Python中打印上级目录的文件列表,确认目标文件是否在Python运行环境的目录中存在:
import os parent_dir = os.path.dirname(target_path) print("Python环境下上级目录文件列表:", os.listdir(parent_dir))
如果列表中没有目标文件,调整挂载配置或者切换到和终端一致的运行环境即可。
注:读取npy文件不需要手动调用
open,直接给np.load传路径即可,就算手动打开也需要使用rb二进制模式,不过该操作不会触发FileNotFoundError,只有路径问题才会返回该错误。
内容的提问来源于stack exchange,提问作者zhangbw
相关产品推荐
相关产品推荐

