使用带有 zip 压缩的 Pandas read_csv

itz*_*tzy 6 python pandas

我正在尝试read_csv在 Pandas 中使用从 FTP 服务器读取压缩文件。根据需要,zip 文件仅包含一个文件。

这是我的代码:

pd.read_csv('ftp://ftp.fec.gov/FEC/2016/cn16.zip', compression='zip')
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

AttributeError: addinfourl instance has no attribute 'seek'
Run Code Online (Sandbox Code Playgroud)

我在 pandas 18.1 和 19.0 中都收到此错误。我错过了什么,或者这可能是一个错误?

Vla*_*den 5

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

压缩:{'infer', 'gzip', 'bz2', 'zip', 'xz', None},默认为 'infer'

用于磁盘数据的即时解压缩。如果 'infer' 和 filepath_or_buffer 是类似路径的,则检测来自以下扩展名的压缩:'.gz'、'.bz2'、'.zip' 或 '.xz'(否则不解压缩)。如果使用“zip”,则 ZIP 文件必须仅包含一个要读入的数据文件。设置为 None 表示不解压。

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


PyN*_*oob 4

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

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

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