合并多文件夹WAV文件的Python代码运行异常求助
问题分析与修复方案
你的代码核心问题是循环结构逻辑错误(三个for循环平级而非嵌套),再加上路径转义、文件排序等细节问题,导致合并逻辑要么只执行一次处理最后一个文件夹,要么因路径解析错误抛出写入异常。以下是修正后的完整代码及关键说明:
修正后的代码
import wave import os from contextlib import closing # 使用原始字符串避免Windows路径转义问题 root_path = r"I:\SwiftOne_000" output_root = r"D:\SwiftD" # 确保输出目录存在,不存在则自动创建 os.makedirs(output_root, exist_ok=True) # 遍历所有日期文件夹 for folder_name in os.listdir(root_path): folder_path = os.path.join(root_path, folder_name) # 跳过目录中的非文件夹项(如果存在) if not os.path.isdir(folder_path): continue # 收集当前文件夹下的所有WAV文件,并按文件名排序(保证音频时间顺序正确) wav_files = [] for filename in sorted(os.listdir(folder_path)): if filename.lower().endswith(".wav"): wav_files.append(os.path.join(folder_path, filename)) if not wav_files: print(f"文件夹 {folder_name} 中无WAV文件,跳过") continue # 设置输出文件名,直接用文件夹名称命名 output_file = os.path.join(output_root, f"{folder_name}.wav") # 执行音频合并操作 with closing(wave.open(output_file, 'wb')) as output: # 从第一个音频文件获取统一的参数(采样率、位深、声道数等) with closing(wave.open(wav_files[0], 'rb')) as first_wav: output.setparams(first_wav.getparams()) # 逐个读取音频帧并写入输出文件 for wav_path in wav_files: with closing(wave.open(wav_path, 'rb')) as wav_file: output.writeframes(wav_file.readframes(wav_file.getnframes())) print(f"已完成 {folder_name} 的音频合并,输出文件:{output_file}")
关键修改点说明
- 循环结构修复:将原本平级的三个for循环改为嵌套结构,确保每个日期文件夹都会触发一次完整的合并流程。
- 路径处理优化:
- 用原始字符串
r"路径"避免Windows反斜杠的转义解析错误; - 采用
os.path.join()拼接路径,适配不同操作系统,避免手动拼接时的格式错误。
- 用原始字符串
- 文件排序:通过
sorted()对文件夹内的WAV文件排序,保证合并后的音频按时间顺序排列(假设文件名是按录制时间命名的)。 - 异常预防:
- 添加输出目录检查创建逻辑,避免因目录不存在导致写入失败;
- 增加空文件夹判断,跳过无WAV文件的目录,避免合并时因索引空列表报错。
内容的提问来源于stack exchange,提问作者NEforester
相关产品推荐
相关产品推荐

