批量自动化按小时合并WAV文件及脚本优化求助
优化WAV合并脚本的文件名递增逻辑
先说说你当前代码里的几个明显问题,导致语法错误和逻辑失效:
glob.glob("*.wav")没有指定具体的子目录路径,会在脚本运行的当前工作目录查找WAV文件,而不是你遍历到的每个YYYYMMDD目录里的文件combined.export的字符串格式化语法错误,% i应该嵌入到引号内的字符串中,不能放在参数列表后面- Python里没有
i++这种写法,而且这里的i是目录名称(比如20240520),用它来做递增编号也不符合需求
下面是调整后的完整脚本,解决了这些问题,同时实现了文件名自动递增的逻辑:
import os import glob from pydub import AudioSegment rootdir = 'PATH/TO/DIRECTORY1' concat_dir = os.path.join(rootdir, 'DIRECTORY1_CONCATENATED') # 创建合并目录,如果不存在的话 os.makedirs(concat_dir, exist_ok=True) # 初始化递增计数器,从1开始 file_counter = 1 for root, dirs, files in os.walk(rootdir): for dir_name in dirs: # 拼接当前子目录的完整路径 current_dir = os.path.join(root, dir_name) # 只找当前子目录下的WAV文件 wav_files = glob.glob(os.path.join(current_dir, "*.wav")) if not wav_files: print(f"目录 {dir_name} 中没有WAV文件,跳过") continue # 按录音时间排序WAV文件(因为文件名是HHMMSS格式,直接字符串排序即可) wav_files.sort() # 初始化合并音频 combined = AudioSegment.empty() for wav_file in wav_files: clip = AudioSegment.from_wav(wav_file) combined += clip # 生成递增的文件名,比如 DIRECTORY1_001.wav、DIRECTORY1_002.wav(补零保证编号对齐) output_filename = f"DIRECTORY1_{file_counter:03d}.wav" output_path = os.path.join(concat_dir, output_filename) # 导出合并后的文件 combined.export(output_path, format="wav") print(f"已生成合并文件:{output_path}") # 计数器自增 file_counter += 1
关键优化点说明:
- 路径正确性:用
os.path.join拼接目录路径,避免因操作系统差异导致的路径错误,同时确保在指定的YYYYMMDD目录下查找WAV文件 - 文件名递增:用独立的
file_counter变量实现自动编号,file_counter:03d会把数字格式化为3位带前导零的字符串(比如1→001,10→010),让文件名排序更整齐 - 文件排序:对WAV文件按文件名排序,保证合并顺序是按录音时间从早到晚
- 容错处理:如果某个目录没有WAV文件,会跳过并打印提示,避免报错中断脚本
- 目录自动创建:用
os.makedirs(..., exist_ok=True)确保合并目录存在,不用手动提前创建
如果你需要按小时区间来归类并合并(比如每个目录下按00-01点、01-02点等生成对应合并文件),可以再调整逻辑——先把每个YYYYMMDD目录下的WAV按小时分到子目录,再合并每个小时子目录的文件,文件名可以设为{dir_name}_{hour:02d}.wav(比如20240520_08.wav表示5月20日8点的合并音频)。如果需要这种逻辑可以告诉我,我再给你调整代码~
内容的提问来源于stack exchange,提问作者user13714495
相关产品推荐
相关产品推荐

