使用BytesIO读取csv文件的pandas方法

10
我有一个类似于文件的BytesIO对象,其中包含CSV数据。我想将它读入Pandas dataframe中,而不需要在中间写入磁盘。

最小工作示例

在我的使用情况中,我直接将文件下载到了BytesIO中。对于这个最小工作示例,我将文件存储在磁盘上,将其读入BytesIO,然后将其读入Pandas。磁盘步骤只是为了制作最小工作示例。

file.csv

a,b
1,2
3,4

脚本:

import pandas as pd
from io import BytesIO
bio = BytesIO()
with open('file.csv', 'rb') as f:
   bio.write(f.read())

# now we have a BytesIO with a CSV
df = pd.read_csv(bio)

结果:

Traceback (most recent call last):
  File "pandas-io.py", line 8, in <module>
    df = pd.read_csv(bio)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 685, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 457, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 895, in __init__
    self._make_engine(self.engine)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 1135, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 1917, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas/_libs/parsers.pyx", line 545, in pandas._libs.parsers.TextReader.__cinit__
pandas.errors.EmptyDataError: No columns to parse from file

请注意,这似乎是与此帖子的标题类似的问题,但错误信息不同,并且该帖子存在X-Y问题。
1个回答

25

错误提示文件为空。

这是因为在向BytesIO对象写入后,文件指针位于文件的末尾,准备继续写入。因此,当Pandas尝试读取它时,它会从上次写入的最后一个字节之后开始读取。

所以你需要将指针移回到开头,才能让Pandas读取。

bio.seek(0)
df = pd.read_csv(bio)

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