2016-11-22 2 views
3

Ich versuche read_csv in Pandas zu verwenden, um eine gezippte Datei von einem FTP-Server zu lesen. Die Zip-Datei enthält nur eine Datei, wie sie benötigt wird.Verwenden von Pandas read_csv mit Zip-Komprimierung

Hier ist mein Code:

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

ich diesen Fehler:

AttributeError: addinfourl instance has no attribute 'seek' 

ich diesen Fehler in beiden Pandas 18,1 und 19,0. Fehle ich etwas oder könnte das ein Käfer sein?

+0

Wie viele existieren Dateien in dieser ZIP-Datei? – amin

+0

Es gibt nur eine Datei, wie erforderlich – itzy

+1

scheinen 'zip' braucht' seek() 'zu Dateizeiger bewegen, aber Internet-Stream (' http', 'ftp', etc.) ist keine echte Datei und hat keine Funktion' suchen() ' – furas

Antwort

3

Obwohl ich nicht ganz sicher bin, warum Sie den Fehler erhalten, können Sie umgehen, indem Sie die URL mit urllib2 öffnen und die Daten in einen In-Memory-Binär-Stream schreiben, wie gezeigt here. Außerdem müssen wir das korrekte Trennzeichen angeben, sonst würden wir einen anderen Fehler erhalten.

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) 

Was die Fehler selbst, glaube ich Pandas auf der „Zip-Datei“ vor dem Herunterladen der URL-Inhalte suchen zu verwenden versucht (so ist es nicht wirklich eine Zip-Datei), die in diesem Fehler führen würden .

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)) 

von meiner eigenen Blog-Post Genommen: Read zipped csv files in python pandas without downloading zipfile

Verwandte Themen