将 ZipFile 从 URL 读取到 StringIO 中并使用 panda.read_csv 进行解析

Win*_*ton 5 python stringio pandas python-zipfile

ZipFile我正在尝试从 URL读取数据并通过使用解析 as csvStringIO内的数据ZipFilepandas.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)
Run Code Online (Sandbox Code Playgroud)

最后一行给了我一个错误:

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

但是如果我尝试使用

salaries = pd.read_csv(file.open("Salaries.csv"))
Run Code Online (Sandbox Code Playgroud)

有用。

所以我想知道我在这里错过了什么。

file.open应该返回一个ZipExtFile对象,并且由于 read_csv 仅接受字符串或文件句柄/StringIO输入,为什么最后一行可以工作?

BBD*_*Sys 6

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)
Run Code Online (Sandbox Code Playgroud)


fir*_*ynx 3

我认为您读取数据的方式有问题,它对我使用 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
Run Code Online (Sandbox Code Playgroud)