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

合并多文件夹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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:05:20