无法在python中使用StringIO的read()获取数据


73

使用Python2.7版本。下面是我的示例代码。

import StringIO
import sys

buff = StringIO.StringIO()
buff.write("hello")
print buff.read()

在上面的程序中,read()不返回任何内容,而getvalue()则返回“你好”。谁能帮我解决这个问题?我需要read(),因为我的以下代码涉及读取“ n”个字节。



@ChasingDeath:是的。尝试dir(StringIO.StringIO)
乔尔·科内特

2
是的,StringIO为字符串创建了一个类似于对象的文件,所以当然会有read()
jamylak

Answers:


101

您需要将缓冲区位置重置为开始位置。您可以通过执行此操作buff.seek(0)

每次读取或写入缓冲区时,该位置都会前移一个。假设您从一个空的缓冲区开始。

缓冲区值为"",缓冲区pos为0。你做buff.write("hello")。显然,缓冲区的值为now hello。但是,缓冲区位置现在是5。当您致电时read(),没有任何位置5可以阅读!因此它返回一个空字符串。


22
In [38]: out_2 = StringIO.StringIO('not use write') # be initialized to an existing string by passing the string to the constructor

In [39]: out_2.getvalue()
Out[39]: 'not use write'

In [40]: out_2.read()
Out[40]: 'not use write'

要么

In [5]: out = StringIO.StringIO()

In [6]: out.write('use write')

In [8]: out.seek(0)

In [9]: out.read()
Out[9]: 'use write'

当我尝试将泡菜转储到StringIO并上传到s3时,out.seek(0)是我所缺少的。一旦回到最开始,我的s3对象将被正确填充。
马修(Matthew)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.