如何通过Python基于WAV文件名筛选生成对应文本文件
嘿,这个需求在语音数据集预处理里太常见了!我来给你一套清晰的Python实现方案,分步骤来看:
实现方案
1. 核心逻辑梳理
我们要完成三件关键事情:
- 扫描目标目录,收集所有WAV文件的文件名(注意要去掉
.wav后缀,因为你的文本文件里存的是不带后缀的文件名格式) - 读取原始文本文件,逐行检查文件名是否存在于WAV文件集合中
- 将匹配成功的行写入新的文本文件
2. 完整代码实现
import os # 配置路径(根据你的实际情况修改) wav_dir = "/path/to/your/wav/files" # 替换成你的WAV文件目录 original_txt = "/path/to/original/text/file.txt" # 替换成原始文本文件路径 output_txt = "/path/to/output/new_file.txt" # 替换成输出文件路径 # 步骤1:收集所有WAV文件名(去掉后缀) wav_filenames = set() for filename in os.listdir(wav_dir): if filename.endswith(".wav"): # 去掉.wav后缀,得到和文本里一致的文件名格式 wav_filenames.add(filename[:-4]) # 步骤2:读取原始文本,筛选匹配行 matched_lines = [] with open(original_txt, "r", encoding="utf-8") as f: for line in f: line = line.strip() # 去掉换行符和首尾空格 if not line: continue # 跳过空行 # 按|分割,注意处理可能的空格(如果有的话) parts = line.split("|") if len(parts) != 2: print(f"警告:无效行格式,跳过:{line}") continue txt_filename = parts[0].strip() # 判断这个文件名是否在WAV集合中 if txt_filename in wav_filenames: matched_lines.append(line) # 步骤3:写入新文件 with open(output_txt, "w", encoding="utf-8") as f: f.write("\n".join(matched_lines)) print(f"处理完成!已生成新文件:{output_txt}")
3. 优化与注意事项
- 用集合存储WAV文件名:集合的成员查询速度是O(1),如果你的WAV文件数量很多(比如上万级),比用列表查询快太多
- 编码适配:如果你的文本文件不是UTF-8编码,记得把
encoding="utf-8"改成对应的编码(比如gbk) - 异常行处理:代码里自动跳过空行和格式不正确的行,避免程序报错中断
- 安全路径处理:如果路径包含特殊字符或空格,建议用
os.path.join()拼接路径,比如os.path.join(wav_dir, filename),兼容性更好
如果你需要更精准匹配WAV文件(比如避免目录里其他带.wav的非目标文件),可以用glob模块替换步骤1的代码:
from glob import glob wav_filenames = set() # 匹配目录下所有.wav文件,要包含子目录的话用**/*.wav for wav_path in glob(os.path.join(wav_dir, "*.wav")): # 提取纯文件名(不带路径和后缀) filename = os.path.basename(wav_path)[:-4] wav_filenames.add(filename)
这样处理起来会更灵活!
内容的提问来源于stack exchange,提问作者David Aksnes
相关产品推荐
相关产品推荐

