python wave模块可以接受StringIO对象吗
Posted
技术标签:
【中文标题】python wave模块可以接受StringIO对象吗【英文标题】:can the python wave module accept StringIO object 【发布时间】:2010-06-16 08:37:12 【问题描述】:我正在尝试使用wave 模块来读取python 中的wav 文件。
我的应用程序的不典型之处在于我 不 使用文件或文件名来读取 wav 文件,而是将 wav 文件放在缓冲区中。
这就是我正在做的事情
import StringIO
buffer = StringIO.StringIO()
buffer.output(wav_buffer)
file = wave.open(buffer, 'r')
但是当我运行它时我得到一个EOFError
...
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()
【问题讨论】:
【参考方案1】:试试这个:
import StringIO
buffer = StringIO.StringIO(wav_buffer)
file = wave.open(buffer, 'r')
【讨论】:
【参考方案2】:buffer = StringIO.StringIO()
buffer.output(wav_buffer)
StringIO 不能这样工作。它不是连接到自身的管道:当您 read()
时,您不会收到之前传递给 write()
的数据。 (别介意output()
,我猜这是一个错误的粘贴,因为没有这样的方法。)
相反,它充当单独的读取管道和写入管道。 read()
会返回的内容是用构造函数传入的:
buffer = StringIO.StringIO(wav_buffer)
file = wave.open(buffer, 'rb')
从write()
收集的任何内容都可以通过getvalue()
阅读。
(我使用二进制读取模式,因为这是正在发生的事情,尽管wave
模块无论如何都会默默地将r
模式转换为rb
。)
【讨论】:
cStringIO 工作速度更快,所以我推荐使用 cStringIO以上是关于python wave模块可以接受StringIO对象吗的主要内容,如果未能解决你的问题,请参考以下文章
python模块之StringIO/cStringIO(内存文件)
AttributeError: type object '_io.StringIO' has no attribute 'StringIO'