在 python 中使用 StringIO 的 read() 获取数据失败

Posted

技术标签:

【中文标题】在 python 中使用 StringIO 的 read() 获取数据失败【英文标题】:Fail to get data on using read() of StringIO in python 【发布时间】:2012-05-03 04:22:12 【问题描述】:

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

import StringIO
import sys

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

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

【问题讨论】:

stringIO 中没有名为 read() 的函数 @ChasingDeath:是的。试试dir(StringIO.StringIO) 是的,StringIO 为字符串创建了一个类似对象的文件,所以当然会有read() 【参考方案1】:

您需要将缓冲区位置重置为开头。你可以通过buff.seek(0) 来做到这一点。

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

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

【讨论】:

【参考方案2】:
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'

【讨论】:

out.seek(0) 是我试图将泡菜转储到 StringIO 并上传到 s3 时所缺少的。一旦我推回到开头,我的 s3 对象就会被正确填充。

以上是关于在 python 中使用 StringIO 的 read() 获取数据失败的主要内容,如果未能解决你的问题,请参考以下文章

我们应该使用 pandas.compat.StringIO 还是 Python 2/3 StringIO?

python中的StringIO在现实中是做啥用的?

python 在内存中读写:StringIO / BytesIO

python--StringIO-在内存中读写str

在PYTHON中使用StringIO的性能提升实测

python模块—StringIO and BytesIO