Прочтите ZipFile из URL-адреса в StringIO и проанализируйте с помощью panda.read_csv

Я пытаюсь прочитать ZipFile данные из URL-адреса и через StringIO проанализировать данные внутри ZipFile как csv, используя pandas.read_csv

r = req.get("http://seanlahman.com/files/database/lahman-csv_2014-02-14.zip").content
file = ZipFile(StringIO(r))
salaries_csv = file.open("Salaries.csv")
salaries = pd.read_csv(salaries_csv)

Последняя строка дала мне ошибку:

CParserError: Error tokenizing data. C error: Calling read(nbytes) on source failed. Try engine='python'.

Однако, если я попробую использовать

salaries = pd.read_csv(file.open("Salaries.csv"))

оно работает.

Так что мне было интересно, что я здесь упускаю.

file.open должен возвращать объект ZipExtFile, и поскольку read_csv принимает только ввод строки или дескриптора файла / StringIO, почему тогда последняя строка работает?


person Winston    schedule 12.08.2015    source источник


Ответы (2)


Я думаю, что что-то не так с тем, как вы читаете данные, у меня это работает с использованием urllib2.

from zipfile import ZipFile
from StringIO import StringIO
import urllib2

r = urllib2.urlopen("http://seanlahman.com/files/database/lahman-csv_2014-02-14.zip").read()
file = ZipFile(StringIO(r))
salaries_csv = file.open("Salaries.csv")
salaries = pd.read_csv(salaries_csv)
       yearID teamID lgID   playerID    salary
0        1985    BAL   AL  murraed02   1472819
1        1985    BAL   AL   lynnfr01   1090000
2        1985    BAL   AL  ripkeca01    800000
3        1985    BAL   AL   lacyle01    725000
4        1985    BAL   AL  flanami01    641667
5        1985    BAL   AL  boddimi01    625000
6        1985    BAL   AL  stewasa01    581250
7        1985    BAL   AL  martide01    560000
person firelynx    schedule 12.08.2015
comment
Спасибо @firelynx. Идеальное решение. - person user770901; 28.11.2015

Несколько изменений для Python 3.5 в ответ @ firelynx

from zipfile import ZipFile
from io import BytesIO
import urllib.request as urllib2

r = urllib2.urlopen("http://seanlahman.com/files/database/lahman-csv_2014-02-14.zip").read()
file = ZipFile(BytesIO(r))
salaries_csv = file.open("Salaries.csv")
salaries = pd.read_csv(salaries_csv)
print (salaries)
person BBSysDyn    schedule 04.06.2021