我试图在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中都遇到了这个错误。我错过了什么,或者这可能是一个错误?
答案 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")