StringIO and pandas read_csv

50

我正在尝试将StringIO和BytesIO与pandas混合使用,但在一些基本问题上感到困惑。例如,我无法使下面的"output"工作,而下面的"output2"确实可以正常工作。但是,"output"更接近我要做的真实世界示例。 "output2"的方法来自于一个旧的pandas示例,但不是我想要的有用方式。

import io   # note for python 3 only
            # in python2 need to import StringIO

output = io.StringIO()
output.write('x,y\n')
output.write('1,2\n')

output2 = io.StringIO("""x,y
1,2
""")

它们在类型和内容方面似乎是相同的:

type(output) == type(output2)
Out[159]: True

output.getvalue() == output2.getvalue()
Out[160]: True

但不,不是一样的:

output == output2
Out[161]: False

更切合我试图解决的问题:

pd.read_csv(output)   # ValueError: No columns to parse from file
pd.read_csv(output2)  # works fine, same as reading from a file
1个回答

76

io.StringIO在这里的表现就像一个文件——您向其写入内容后,文件指针会指向末尾。在此之后,如果您尝试从中读取内容,除了您写入的内容外,没有其他可以解析的列。

因此,就像处理普通文件一样,需要使用seek将指针移动到开头,然后再进行读取操作:

>>> output = io.StringIO()
>>> output.write('x,y\n')
4
>>> output.write('1,2\n')
4
>>> output.seek(0)
0
>>> pd.read_csv(output)
   x  y
0  1  2

1
嗯,实际上对于普通文件,我不会显式地寻找(至少不是明确地),我只需键入“read_csv(file)”即可。但还是谢谢,这很有效! - JohnE
4
@JohnE:我的意思是“就像你处理普通文件一样,当你写入后想要从中读取”。 - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接