使用eyed3加载指定音乐目录文件报不存在错误的解决方案
报错原因
os.listdir() 仅返回目标目录下的文件名,不会携带完整目录前缀。你当前代码直接把孤立的文件名(比如报错里的Bieber_-_Yummy.mp3)传给eyed3.load()时,程序会从脚本当前运行的工作目录查找文件,自然定位不到存放在D:\Music App\music下的资源,这个问题和eyed3本身的目录读取能力无关。
修复代码
方案1:使用os.path拼接路径(兼容所有Python版本)
import os import eyed3 def load_songs(self): # 路径前加r前缀声明为原始字符串,避免反斜杠触发转义 self.music_path = r"D:\Music App\music" self.music_files = os.listdir(self.music_path) for file_name in self.music_files: # 拼接目录和文件名,生成完整绝对路径 full_path = os.path.join(self.music_path, file_name) # 过滤掉子目录、非mp3文件,避免无效加载报错 if os.path.isfile(full_path) and file_name.lower().endswith(".mp3"): self.music = eyed3.load(full_path) # 后续读取专辑、歌手、标题等标签的逻辑写在这里
方案2:使用pathlib(Python3.4+推荐,路径处理更简洁)
from pathlib import Path import eyed3 def load_songs(self): self.music_path = Path(r"D:\Music App\music") # 直接匹配目录下所有mp3格式文件,返回值自带完整路径 for mp3_path in self.music_path.glob("*.mp3"): self.music = eyed3.load(mp3_path) # 后续业务逻辑
额外注意点
- Windows系统下写带反斜杠的路径时,统一加
r前缀,避免\和后续字符组合成转义字符(比如\m、\t)导致路径本身失效 - 如果加载文件时弹出大量标签编码警告,可以在代码初始化位置加
eyed3.log.setLevel("ERROR"),只保留错误级别的日志,不影响正常标签读取 - 如果需要递归读取music目录下所有子文件夹里的音乐,可以把glob规则改成
**/*.mp3,同时加recursive=True参数即可。
内容的提问来源于stack exchange,提问作者Yianji
相关产品推荐
相关产品推荐

