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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:56:35