Python调用wavfile.read读取wav文件报不存在但文件实际存在
问题背景
需要批量读取5个元音对应的多组wav格式音频文件,为减少重复代码,通过嵌套循环实现文件名拼接与批量读取,初始实现代码如下:
num_experimento = 3 vocals = ["a","e","i","o","u"] trabajos = "{letter}-int{number}.wav" for vocal in vocals: for n in range (1, num_experimento+1): archive = trabajos.format(letter=vocal, number=n) sound = wavfile.read(archive) print(sound)
运行代码时触发FileNotFoundError,完整报错信息如下:
FileNotFoundError Traceback (most recent call last) Input In [18], in <cell line: 7>() 8 for n in range (1, num_experimento+1): 9 archive = trabajos.format(letter=vocal, number=n) ---> 10 sound = wavfile.read(archive) 11 print(sound) File c:\programdata\miniconda3\lib\site-packages\scipy\io\wavfile.py:647, in read(filename, mmap) 645 mmap = False 646 else: ---> 647 fid = open(filename, 'rb') 649 try: 650 file_size, is_big_endian = _read_riff_chunk(fid) FileNotFoundError: [Errno 2] No such file or directory: 'a-int1.wav'
经人工核对,目标目录下存在与代码拼接名称完全一致的文件;本地为西班牙语使用环境,截图内命名与贴出代码的命名仅语言差异、逻辑完全一致,相关环境截图:当前工作目录、代码与文件列表截图
故障原因
报错核心是Python进程的工作目录与wav文件实际存放目录不匹配,和西语环境、文件名拼写无关:
- 代码中使用的是不带路径前缀的相对文件名,程序只会在当前Python进程的工作目录下检索目标文件,不会自动扫描其他位置的文件
- 即使代码脚本和wav文件存放在同一个文件夹,通过Miniconda启动的IPython/Jupyter环境默认工作目录通常是用户主目录,并非脚本所在文件夹,会导致相对路径检索失败
- 西语系统的字符编码问题会触发Unicode类报错,不会抛出文件不存在的错误,可直接排除该诱因。
解决方法
- 先校验当前工作目录,确认路径匹配情况
在读取文件的代码前添加如下代码,打印当前Python进程的实际工作目录:
如果打印出的路径和wav文件实际存放的文件夹路径不一致,即可确认是路径匹配问题。import os print(os.getcwd()) - 方案1:直接切换工作目录到音频存放文件夹
在读取逻辑前添加路径切换代码,将路径替换为本地wav文件存放的绝对路径即可,西语路径可正常识别:import os # 替换为本地wav文件所在文件夹的绝对路径 os.chdir(r"C:\替换为\本地wav文件\存放的文件夹路径") - 方案2:拼接绝对路径读取(更稳妥,推荐)
提前定义音频文件的根目录,循环时将根目录和文件名拼接为完整绝对路径再读取,不会受工作目录变动影响:from scipy.io import wavfile import os num_experimento = 3 vocals = ["a","e","i","o","u"] # 替换为本地wav文件所在文件夹的绝对路径 audio_base_path = r"C:\替换为\本地wav文件\存放的文件夹路径" name_template = "{letter}-int{number}.wav" for vocal in vocals: for n in range (1, num_experimento+1): file_name = name_template.format(letter=vocal, number=n) full_file_path = os.path.join(audio_base_path, file_name) # 可加校验逻辑,返回True代表路径正确 # print(os.path.exists(full_file_path)) sound = wavfile.read(full_file_path) print(sound)
内容的提问来源于stack exchange,提问作者AnkokuGG
相关产品推荐
相关产品推荐

