python wave模块可以接受StringIO对象吗

python wave模块可以接受StringIO对象吗,python,audio,wave,Python,Audio,Wave,我正在尝试使用该模块读取python中的wav文件 我的应用程序中不典型的是,我没有使用文件或文件名来读取wav文件,而是将wav文件放在缓冲区中 这就是我正在做的 import StringIO buffer = StringIO.StringIO() buffer.output(wav_buffer) file = wave.open(buffer, 'r') 但是当我运行它时,我得到了一个eoferor File "/System/Library/Frameworks/Pytho

我正在尝试使用该模块读取python中的wav文件

我的应用程序中不典型的是,我没有使用文件或文件名来读取wav文件,而是将wav文件放在缓冲区中

这就是我正在做的

import StringIO

buffer = StringIO.StringIO()
buffer.output(wav_buffer)

file = wave.open(buffer, 'r')
但是当我运行它时,我得到了一个
eoferor

  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wave.py", line 493, in open
return Wave_read(f)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wave.py", line 163, in __init__
self.initfp(f)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wave.py", line 128, in initfp
self._file = Chunk(file, bigendian = 0)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/chunk.py", line 63, in __init__
raise EOFError
我知道
StringIO
的东西可以用来创建wav文件,我尝试了下面的方法,效果很好

import StringIO


buffer = StringIO.StringIO()
audio_out = wave.open(buffer, 'w')
audio_out.setframerate(m.getRate())
audio_out.setsampwidth(2)
audio_out.setcomptype('NONE', 'not compressed')
audio_out.setnchannels(1)

audio_out.writeframes(raw_audio)
audio_out.close()
buffer.flush()

# these lines do not work...
# buffer.output(wav_buffer)
# file = wave.open(buffer, 'r')

# this file plays out fine in VLC
file = open(FILE_NAME + ".wav", 'w')
file.write(buffer.getvalue())
file.close()
buffer.close()
试试这个:

import StringIO

buffer = StringIO.StringIO(wav_buffer)
file = wave.open(buffer, 'r')
StringIO不是这样工作的。它不是一个连接到自身的管道:当您
read()
时,您不会收到以前传递给
write()
的数据。(不要介意
output()
,我猜这是一个错误,因为没有这样的方法。)

相反,它充当一个单独的读管道和写管道。
read()
将返回的内容与构造函数一起传递:

buffer = StringIO.StringIO(wav_buffer)
file = wave.open(buffer, 'rb')
write()
收集的任何内容都可以通过
getvalue()
读取


(我使用二进制读取模式,因为这就是正在发生的事情,尽管
wave
模块会自动将
r
模式转换为
rb

cStringIO工作得更快,所以我建议使用cStringIO
buffer = StringIO.StringIO(wav_buffer)
file = wave.open(buffer, 'rb')