2016-11-22 140 views
3

我試圖在大熊貓中使用read_csv從FTP服務器讀取壓縮文件。根據需要,zip文件只包含一個文件。使用帶有zip壓縮的pandas read_csv

這裏是我的代碼:

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

多少個文件在這個zip文件存在嗎? – amin

+0

只有一個文件,根據需要 – itzy

+1

似乎'zip'需要'seek()'移動文件指針但網絡流('http','ftp'等)不是真實文件,並且沒有函數seek ()' – furas

回答

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內容(所以它不是一個真正的zip文件),這將導致該錯誤嘗試使用前徵求對「壓縮文件」 。

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