Python中glob获取路径后open()无法打开文件的问题求助
解决Python中glob获取路径后open()找不到文件的问题
问题场景
使用glob.glob递归获取.osu文件路径后,调用open()函数时触发FileNotFoundError,怀疑路径中包含编码异常字符,但无法确定。示例问题路径:.\input\537700 Raven-Symone, Anneliese van der Pol, Orlando Brown - That's So Raven! (Theme Song)\Raven-Symone, Anneliese van der Pol, Orlando Brown - That's So Raven! (Theme Song) (fieryrage) [mk's hard].osu
出错代码片段:
files = glob.glob(folder+'*.osu', recursive=True) for file in files: inputFile = open(file, 'r', encoding='utf-8')
对应的报错信息:
Exception has occurred: FileNotFoundError [Errno 2] No such file or directory: ".\input\537700 Raven-Symone, Anneliese van der Pol, Orlando Brown - That's So Raven! (Theme Song)\Raven-Symone, Anneliese van der Pol, Orlando Brown - That's So Raven! (Theme Song) (fieryrage) [mk's hard].osu" File "C:\Users\Jonathan McClen\Documents\SliderToCircleOsuMapConversion\new.py", line 19, in <module> inputFile = open(file, 'r', encoding='utf-8') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [Errno 2] No such file or directory: ".\input\537700 Raven-Symone, Anneliese van der Pol, Orlando Brown - That's So Raven! (Theme Song)\Raven-Symone, Anneliese van der Pol, Orlando Brown - That's So Raven! (Theme Song) (fieryrage) [mk's hard].osu"
解决方法
1. 转换为绝对路径打开
Windows环境下相对路径偶尔会因转义、编码兼容问题失效,先将路径转为绝对路径再尝试打开:
import glob import os folder = "./input/" # 用os.path.join拼接路径,避免手动拼接的分隔符问题 files = glob.glob(os.path.join(folder, '*.osu'), recursive=True) for file in files: abs_file = os.path.abspath(file) try: with open(abs_file, 'r', encoding='utf-8') as inputFile: # 在这里处理文件内容 pass except FileNotFoundError as e: print(f"无法打开文件: {abs_file},错误信息: {e}")
2. 检测路径中的异常字符
如果怀疑路径存在编码异常字符,可以打印每个字符的Unicode编码点,定位问题字符:
for file in files: print(f"目标路径: {file}") print("路径字符编码详情:") for idx, char in enumerate(file): print(f" 位置{idx}: '{char}' - U+{ord(char):04X}") # 尝试打开并捕获错误 try: with open(file, 'r', encoding='utf-8') as f: print("文件打开成功\n") except Exception as e: print(f"打开失败: {e}\n")
通过Unicode编码点可以识别出不可见控制字符、全角/半角混写等异常情况。
3. 尝试多种编码打开
如果文件本身编码不是UTF-8,或路径编码与系统不兼容,可以遍历常见编码尝试打开:
import glob import os import locale folder = "./input/" files = glob.glob(os.path.join(folder, '*.osu'), recursive=True) # 获取系统默认编码 default_encoding = locale.getpreferredencoding() for file in files: abs_file = os.path.abspath(file) # 按优先级尝试编码 for encoding in [default_encoding, 'utf-8', 'gbk']: try: with open(abs_file, 'r', encoding=encoding) as inputFile: print(f"成功打开文件: {abs_file},使用编码: {encoding}") break except (FileNotFoundError, UnicodeDecodeError) as e: continue else: print(f"所有编码均无法打开文件: {abs_file}")
4. 使用pathlib替代glob处理路径
Python3.4+推荐的pathlib库对特殊字符、跨平台路径的处理更可靠,直接用路径对象打开文件:
from pathlib import Path folder = Path("./input/") # 递归查找所有.osu文件 files = list(folder.rglob('*.osu')) for file in files: try: with file.open('r', encoding='utf-8') as inputFile: # 处理文件内容 pass except Exception as e: print(f"无法打开文件: {file},错误信息: {e}")
内容的提问来源于stack exchange,提问作者jonafinmicclen
相关产品推荐
相关产品推荐

