将WAV文件导出为TXT仅获单个值,求代码问题排查帮助
问题分析与解决方案
嘿,我一眼就揪出问题所在啦!你每次循环调用np.savetxt的时候,默认会覆盖掉之前的文件内容,所以循环跑完后,Audio.txt里自然就只剩最后一次写入的那个数值了。
最推荐的高效解法:一次性读取+保存
其实完全没必要逐帧循环读取,wave模块支持一次性读取所有音频帧,处理起来更快也更简洁:
import wave, struct import numpy as np waveFile = wave.open('test1.wav', 'r') frame_count = waveFile.getnframes() # 一次性读取全部音频帧 all_frames = waveFile.readframes(frame_count) # 按音频格式解包所有数据(<h 对应小端字节序的16位整数,适配你的原代码格式) audio_data = struct.unpack(f"<{frame_count}h", all_frames) # 转成numpy数组 data_array = np.array(audio_data) # 一次性写入所有数据到文件 np.savetxt("Audio.txt", data_array, delimiter=",")
如果你需要逐帧处理(比如超大文件)
要是因为音频文件太大,不想一次性加载到内存,那可以改用追加模式写入文件,避免每次覆盖:
import wave, struct import numpy as np waveFile = wave.open('test1.wav', 'r') frame_count = waveFile.getnframes() # 先以写入模式打开文件清空内容(如果之前有旧数据) with open("Audio.txt", "w") as f: pass # 逐帧读取并追加写入 for _ in range(frame_count): wave_data = waveFile.readframes(1) data = struct.unpack("<h", wave_data) data_val = int(data[0]) # 用追加模式打开文件,把当前数值写入末尾 with open("Audio.txt", "a") as f: f.write(f"{data_val},\n")
为什么原代码失效?
np.savetxt默认使用写入模式('w'),每次调用这个函数,都会先清空目标文件,再写入当前传入的数据。你的循环里每次只传一个数值,所以最后文件里就只剩最后一次循环的结果啦。
内容的提问来源于stack exchange,提问作者Laveena
相关产品推荐
相关产品推荐

