2016-06-08 3 views
1

Ich bin eine CSV-Datei angefordert, die Gzipped ist.Wie lese ich eine CSV-Datei, die von URL Gzipped ist - Python

Wie dekomprimiere ich diese Datei und wandle sie in ein csv-Objekt um?

csv_gz_file = get("example.com/filename.csv.gz", headers=csv_headers, timeout=30, stream=True) 

reader = csv.reader(csv_gz_file) 
for row in reader: 
    print row 

Und es wirft dies, weil es nicht

_csv.Error: line contains NULL byte 
+0

Verwenden Sie das 'gzip'-Paket, um die Datei zu extrahieren/dekomprimieren. –

Antwort

6
import gzip 
import io 

web_response = requests.get("example.com/filename.csv.gz", headers=csv_headers, 
          timeout=30, stream=True) 
csv_gz_file = web_response.content # Content in bytes from requests.get 
            # See comments below why this is used. 

f = io.BytesIO(csv_gz_file) 
with gzip.GzipFile(fileobj=f) as fh: 
    # Passing a binary file to csv.reader works in PY2 
    reader = csv.reader(fh) 
    for row in reader: 
     print(row) 

Durch das Speichern der gz Daten im Speicher dekomprimiert ist, extrahiert sie die gzip Modul verwenden und anschließend die Klartextdaten in einer anderen Speicherbehälter lesen und Öffnen Sie schließlich diesen Container mit Ihrem Leser.

Ich bin mir nicht ganz sicher, wie csv.reader erwartet ein Datei-Handle oder list von Daten, aber ich würde annehmen, dass dies funktionieren würde. Wenn nicht einfach tun:

reader = csv.reader(csv_content.splitlines()) 

Und das sollte den Trick tun.

+0

Ich sehe, danke. Es wirft einen Fehler w/Bytes ein 2. Argument aufweist: File "csv_processor.py", Zeile 53, in f = io.BytesIO (Bytes (csv_gz_file 'UTF-8')) Typeerror: Str () nimmt höchstens 1 Argument (2 gegeben) –

+0

@TimNuwin Ich benutze Python3 (wie Sie wahrscheinlich sollten, wenn Sie keinen Grund wissen, nicht zu) - Dort müssen Sie die Codierung 'Bytes (str, enc)' definieren es sollte verwenden. Entfernen Sie einfach ', 'utf-8'' aus der Funktion' bytes() 'in diesem Fall. – Torxed

+0

Ja .. Ich laufe leider 2.7. Dies ist, was passiert, wenn ich die UTF-8-Codierung Argument Traceback (jüngste Aufforderung zuletzt) ​​entfernen: File "csv_processor", Zeile 56, in csv_content = fh.read() ... erhöhen IOError, 'Keine gezippte Datei' IOError: Keine gezippte Datei --- Ich kann die Datei direkt vom Link herunterladen und dekomprimiere sie aber richtig. –

Verwandte Themen