pandas read_csv 来自 BytesIO
pandas read_csv from BytesIO
我有一个 BytesIO file-like object,其中包含一个 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 的标题类似,但错误消息不同,并且 post 存在 X-Y 问题。
错误提示文件为空。
那是因为写入一个BytesIO
对象后,文件指针在文件的末尾,准备写入更多。因此,当 Pandas 尝试读取它时,它会在写入的最后一个字节 之后开始读取 。
因此您需要将指针移回开头,以便 Pandas 阅读。
bio.seek(0)
df = pd.read_csv(bio)
我有一个 BytesIO file-like object,其中包含一个 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 的标题类似,但错误消息不同,并且 post 存在 X-Y 问题。
错误提示文件为空。
那是因为写入一个BytesIO
对象后,文件指针在文件的末尾,准备写入更多。因此,当 Pandas 尝试读取它时,它会在写入的最后一个字节 之后开始读取 。
因此您需要将指针移回开头,以便 Pandas 阅读。
bio.seek(0)
df = pd.read_csv(bio)