from scipy.io.wavfile import read
filepath = glob.glob('*.wav') #list
rate,data = [read(fp) for fp in filepath]
我得到了:
ValueError: too many values to unpack
但我一次只能加载一次。
像这样:rate,data = read('001.wav')
print rate
print data
我得到了:
44100
[0 0 0 ..., 0 0 0]
如何将速率和数据加载到两个数组中,如果我这样做:
datas = [read(fp) for fp in filepath]
我会得到:
[(44100, array([0, 0, 0, ..., 0, 0, 0], dtype=int16)), (44100, array([0, 0, 0, ..., 0, 0, 1], dtype=int16)), ..., (44100, array([0, 0, 0, ..., 0, 0, 0], dtype=int16))]
或者有任何方法可以在加载后将数据拆分为速率和数据。
感谢。
答案 0 :(得分:1)
您可以使用zip(*x)
将其格式化为一个费率列表和一个数据列表列表。
raw_data = [read(fp) for fp in filepath]
rates, data = zip(*raw_data)
例如,
raw_data = zip(range(10), range(20, 30))
# [(0, 20), (1, 21), (2, 22), (3, 23), (4, 24), (5, 25), (6, 26), (7, 27), (8, 28), (9, 29)]
zip(*raw_data)
# [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), (20, 21, 22, 23, 24, 25, 26, 27, 28, 29)]
答案 1 :(得分:1)
您可以在加载后使用反向zip功能将其拆分(如this answer中所述):
In [13]: rate, data = zip(*datas)
In [14]: rate
Out[14]: (44100, 44100)
In [15]: data
Out[15]: (array([0, 0, 0, 0, 0, 0]), array([0, 0, 0, 0, 1]))
我想说在这种情况下这是一种可以接受的方式,虽然我认为使用更经典的for循环,在不使用列表理解的情况下附加到列表,会更清晰:
rates = []
datas = []
for fp in filepath:
rate, data = read(fp)
rates.append(rate)
datas.append(data)
你在第一种情况下获得ValueError
的原因是因为你正在将每个文件的所有元组列表(显然超过2个,给出错误消息)解包为两个变量 - 速率和数据