pandas read_csv из BytesIO - PullRequest
       39

pandas read_csv из BytesIO

0 голосов
/ 09 мая 2020

У меня есть файловый объект 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

Обратите внимание, что это похоже на проблему, аналогичную названию этого сообщения , но сообщения об ошибках другие, и в этом сообщении есть проблема XY.

1 Ответ

2 голосов
/ 09 мая 2020

Ошибка говорит о том, что файл пуст.

Это потому, что после записи в объект BytesIO указатель файла находится в конце файла, готов к записи еще. Поэтому, когда Pandas пытается его прочитать, он начинает читать после последнего записанного байта.

Итак, вам нужно переместить указатель обратно в начало, чтобы Pandas читать.

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