2017-02-03 5 views
1

Ich kann die heruntergeladene Datei von this URL mit Pythons zipfile Einrichtung nicht öffnen.Python 3.5 öffnet keine Zip-Datei

Diese Datei tut offen meinem Mac eingebauten in deflater verwenden, aber, und python-magic (via import magic; magic.from_file("...")) berichtet, dass die Datei:

'Zip archive data, at least v2.0 to extract'.

Doch wenn ich tun:

with open("498200/Broadband Data Dig - Datasets/NYC Connected Broadband Data Dig Files.zip") as fp: 
    zipcontent = zipfile.ZipFile(fp) 

ich:

BadZipFile: File is not a zip file

Meine Python-Version 3.5.2 ist. Was ist denn hier los?

Antwort

2

ZipFile öffnet die Datei auf dem Dateinamen basiert:

with zipfile.ZipFile("498200/Broadband Data Dig - Datasets/NYC Connected Broadband Data Dig Files.zip") as zip_file: 
    print("do stuff with", zip_file) 
+0

Oof. Senior-Moment, danke. –

4

zipfile.ZipFile claims compatibility with file-like objects, aber es erfordert fast sicher, dass sie Binär-Modus, nicht im Textmodus sein.

für eine minimale Änderungen zu beheben, versuchen:

with open("498200/Broadband Data Dig - Datasets/NYC Connected Broadband Data Dig Files.zip", 
      "rb") as fp: 
    zipcontent = zipfile.ZipFile(fp) 

Oder wie Trey erwähnt, benutzen Sie einfach die with Aussage über zipfile.ZipFile('name/of/file.zip') direkt, ohne sie zunächst als einfache Datei zu öffnen.

+1

Ich hatte nicht realisiert, dass 'ZipFile' mit dateiähnlichen Objekten arbeitete. Danke, dass du das unterstrichen hast! –

+0

Ich habe mein Beispiel etwas vereinfacht, um ein minimales Beispiel zu bekommen, hier ist das Original: 'z = zipfile.ZipFile (io.BytesIO (r.content))', wobei 'r' ein' requests.get' Objekt ist für die URL oben. Weißt du, was dort vor sich geht? –

+1

@ResMar: Nun, beim Testen, wenn ich ein tatsächliches 'bytes'-Objekt habe, das aus einer legitimen Zip-Datei gelesen wurde, um an' io.BytesIO' zu übergeben, ist 'zipfile.ZipFile' in Ordnung. Sind Sie sicher, dass Sie eine legitime Datei im Zip-Format erhalten? Nicht 'gzip' komprimiert (was' requests' nahtlos für Sie dekomprimiert) oder eine andere Komprimierung? Wenn Sie 'r.content' einfach in eine Datei im Binärmodus schreiben, dann öffnen Sie diese Datei mit einem Zip-Datei-Leseprogramm, funktioniert das? – ShadowRanger