如何使用sprintf命令逐个读取特定命名规则的WAV文件?
解决Matlab读取两位数字命名WAV文件的报错问题
咱们先拆解下你遇到的两个问题,然后一步步修正:
第一个代码的问题
你最初的嵌套循环里,sprintf生成的文件名缺少.wav后缀,而且用了已经被Matlab弃用的wavread函数。比如当m=0、y=0时,生成的路径是E:\0 (1)\0\00,但实际你的文件应该是00.wav,系统自然找不到对应的文件。
第二个代码的问题
你调整后的代码里,sprintf的格式字符串写错了——%s%d.wav里的%s是用来格式化字符串的,但你传入的是数字m和y,这会导致格式不匹配,生成的文件名完全不对。另外那个“Function is not defined for sparse inputs”的报错,大概率是因为格式错误导致文件名无效,或者你之前的代码不小心把m/y定义成了稀疏矩阵类型。
修正后的代码方案
这里给你两种靠谱的写法,选哪种都可以:
方案一:单循环直接遍历0-59
这种写法更简洁,直接用%02d生成两位数字的文件名(自动补前导零):
mypath = 'E:\0 (1)\0\'; for idx = 0:59 % 用fullfile拼接路径和文件名,避免手动处理分隔符的坑 filename = fullfile(mypath, sprintf('%02d.wav', idx)); [s, fs] = audioread(filename); % 这里可以添加你对音频数据s和采样率fs的处理代码 end
方案二:保留嵌套循环
如果你想保持原来的说话人ID+发音ID的逻辑,这样写:
mypath = 'E:\0 (1)\0\'; for m = 0:5 for y = 0:9 filename = fullfile(mypath, sprintf('%d%d.wav', m, y)); [s, fs] = audioread(filename); % 处理音频数据的代码 end end
额外注意事项
- 建议先加一行
disp(filename)打印生成的文件名,确认和你实际的WAV文件名完全一致,比如是不是漏了后缀、路径有没有写错。 - 尽量用
fullfile拼接路径,它会自动适配Windows/macOS的路径分隔符,比手动写反斜杠更稳妥。
内容的提问来源于stack exchange,提问作者Sangeet Sagar
相关产品推荐
相关产品推荐

