使用带压缩压缩的pandas read_csv

时间:2016-11-22 14:08:28

标签: python pandas

我试图在pandas中使用read_csv来从FTP服务器读取压缩文件。根据需要,zip文件只包含一个文件。

这是我的代码:

pd.read_csv('ftp://ftp.fec.gov/FEC/2016/cn16.zip', compression='zip')

我收到此错误:

AttributeError: addinfourl instance has no attribute 'seek'

我在大熊猫18.1和19.0中都遇到了这个错误。我错过了什么,或者这可能是一个错误?

3 个答案:

答案 0 :(得分:3)

虽然我不完全确定您为什么会收到错误,但您可以通过使用urllib2打开网址并将数据写入内存中的二进制流来解决问题,如图所示here 。另外,我们必须指定正确的分隔符,否则我们会收到另一个错误。

import io
import urllib2 as urllib
import pandas as pd

r = urllib.urlopen('ftp://ftp.fec.gov/FEC/2016/cn16.zip')
df = pd.read_csv(io.BytesIO(r.read()), compression='zip', sep='|', header=None)

就错误本身而言,我认为在下载url内容之前,pandas试图在“zip文件”上使用seek(因此它不是真正的zip文件),这会导致错误。

答案 1 :(得分:0)

header = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/54.0.1',}
remotezip = requests.get(url, headers=header)
root = zipfile.ZipFile(io.BytesIO(remotezip.content))
for name in root.namelist():
            df = pd.read_csv(root.open(name)) 

取自我自己的博文: Read zipped csv files in python pandas without downloading zipfile

答案 2 :(得分:0)

pandas现在支持将数据直接从zip或其他压缩文件加载到DataFrame。

  

压缩:{'推断','gzip','bz2','zip','xz',无},默认为'推断'

     

用于磁盘数据的即时解压缩。如果“推断”并且   filepath_or_buffer类似于路径,然后从   以下扩展名:“。gz”,“。bz2”,“。zip”或“ .xz”(否则为   减压)。如果使用“ zip”,则ZIP文件中只能包含一个   要读取的数据文件。设置为“无”将不进行解压缩。

     

0.18.1版中的新功能:支持“ zip”和“ xz”压缩。

import pandas as pd

df = pd.read_csv("path_to_file.zip")
# or
df = pd.read_csv("path_to_file.zip", compression="zip")