我在Python中有一些数据要输出到WAV文件。现在我将所有样本生成为short并将它们放入缓冲区。然后每当缓冲区达到一定长度时,我打包数据并将其发送到writeframes(在写入每个样本之间妥协,这很慢,并且在写入之前将整个内容保存在内存中,这很昂贵)。
但它总是抛出TypeError。
output = wave.open(fname, 'wb')
output.setparams((channels, sample_width, sample_rate, 0, 'NONE', 'not compressed'))
# ...generate the data, write to the buffer, then if the buffer is full...
cooked = []
for (ldata, rdata) in rawdata:
cooked.append(struct.pack('<hh',ldata,rdata)) # Pack it as two signed shorts, little endian
output.writeframes(bytes.join(cooked)) # Write to the wave file
我还尝试了''.join(cooked)
,bytes(cooked)
,并从一开始就使cooked
成为bytearray
,但这些似乎都不起作用。
如上所述
output.writeframes(bytes.join(cooked)) # Write to the wave file
TypeError: descriptor 'join' requires a 'bytes' object but received a 'list'
使用bytes()
output.writeframes(bytes(cooked)) # Write to the wave file
TypeError: 'bytes' object cannot be interpreted as an integer
使cooked
成为一个bytearray
cooked.append(struct.pack('<hh',ldata,rdata)) # Pack it as two signed shorts, little endian
TypeError: an integer is required
直接发送cooked
TypeError: memoryview: list object does not have the buffer interface
使用''.join()
output.writeframes(''.join(cooked)) # Write to the wave file
TypeError: sequence item 0: expected str instance, bytes found
这样做的正确方法是什么?我无法弄清楚Python究竟想要什么。
编辑:如果这会影响任何事情,请使用Python 3.4.1。
答案 0 :(得分:4)
你需要这样做:
button.MacroName = sheet.Name + ".HelloWorld";
方法的第一个参数是output.writeframes(b''.join(cooked))
。如果正常调用该方法,则会自动传递此参数。但是,如果您通过self
调用它,则必须手动传递。由于您传递的是列表而不是Class.method()
对象作为第一个参数,因此您得到了第一个TypeError。
为了完整起见,以下是其余的错误:
bytes
output.writeframes(bytes(cooked)) # Write to the wave file
TypeError: 'bytes' object cannot be interpreted as an integer
接受一系列整数;而且它们一次只有一个字节。您需要使用按位运算而不是bytes()
(例如struct.pack()
用于小端16位整数,假设没有大于0xFFFF并且没有计算负数)。
cooked.extend((ldata & 0xFF, ldata >> 8, rdata & 0xFF, rdata >> 8))
同样,cooked.append(struct.pack('<hh',ldata,rdata)) # Pack it as two signed shorts, little endian
TypeError: an integer is required
接受一个整数。
bytearray.append()
output.writeframes(cooked)
TypeError: memoryview: list object does not have the buffer interface
不是类似字节的对象,因此writeframes()
无法接受。{/ p>
list
您不能混合使用文本和二进制字符串。