从URL读取ZipFile到StringIO并用panda.read_csv解析

时间:2015-08-12 14:08:53

标签: python pandas zipfile stringio

我尝试从网址中读取@Override public void nextTuple() { if(count <= 100000) { System.out.println("Emitting : " + count); collector.emit(new Values(count++ + ""), count); } } 数据并通过ZipFile使用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对象,因为read_csv只接受字符串或文件句柄/ ZipExtFile输入,为什么最后一行才有效呢?

2 个答案:

答案 0 :(得分:1)

我认为你读取数据的方式有问题,使用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

答案 1 :(得分:0)

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)