我正在尝试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 中都收到此错误。我错过了什么,或者这可能是一个错误?
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)
虽然我不完全确定为什么会出现错误,但您可以通过使用打开 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 文件),这会导致该错误。