来自 BytesIO 的熊猫 read_csv

Posted

技术标签:

【中文标题】来自 BytesIO 的熊猫 read_csv【英文标题】:pandas read_csv from BytesIO 【发布时间】:2020-08-24 16:38:56 【问题描述】:

我有一个 BytesIO 类文件对象,其中包含一个 CSV。 我想将它读入 Pandas 数据帧,而无需在两者之间写入磁盘。

MWE

在我的用例中,我将文件直接下载到 BytesIO。 对于这个 MWE,我将在磁盘上有一个文件,将其读入 BytesIO,然后将其读入 Pandas。 磁盘步骤只是做一个MWE。

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

请注意,这听起来与this post的标题类似,但错误信息不同,并且该帖子存在X-Y问题。

【问题讨论】:

【参考方案1】:

错误提示文件为空。

这是因为在写入BytesIO 对象后,文件指针位于文件的end,准备写入更多内容。因此,当 Pandas 尝试读取它时,它会在 写入的最后一个字节之后开始读取。

因此,您需要将指针移回起点,以便 Pandas 读取。

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

【讨论】:

以上是关于来自 BytesIO 的熊猫 read_csv的主要内容,如果未能解决你的问题,请参考以下文章

如何使用exchangelib在python中将熊猫数据框作为电子邮件附件发送

来自熊猫数据框嵌套字典的熊猫数据框

这个熊猫警告来自哪里?

熊猫:来自没有合并的匹配的列

python 来自csv的大熊猫

来自按级别分组的多索引熊猫数据框的子图