2015-04-01 10 views
8

erreicht wurde ich eine komprimierte Datei aus dem Internet herunterlade:Herunterladen großer Dateien in Python Fehler: Komprimierte Datei beendet, bevor der End-of-Stream-Marker

with lzma.open(urllib.request.urlopen(url)) as file: 
    for line in file: 
     ... 

Nach heruntergeladen haben und verarbeitet aa großen Teil der Datei, erhalte ich schließlich den Fehler:

File "/usr/lib/python3.4/lzma.py", line 225, in _fill_buffer raise EOFError("Compressed file ended before the " EOFError: Compressed file ended before the end-of-stream marker was reached

ich denke ich, dass es durch eine Internet-Verbindung verursacht werden könnten, die Tropfen oder der Server für einige Zeit nicht reagiert. Wenn das der Fall ist, gibt es es trotzdem, um es weiter versuchen zu lassen, bis die Verbindung wieder hergestellt ist, anstatt eine Ausnahme auszulösen. Ich glaube nicht, dass es ein Problem mit der Datei ist, da ich manuell viele Dateien von der gleichen Website manuell heruntergeladen und dekomprimiert habe. Ich war auch in der Lage, einige kleinere Dateien mit Python herunterzuladen und zu dekomprimieren. Die Datei, die ich herunterladen möchte, hat eine komprimierte Größe von ca. 20 GB.

+0

Wie lange dauert das Herunterladen, bevor der Fehler auftritt? Einige Firewalls/Proxys scheinen Verbindungen nach einer festen Zeitüberschreitung (z. B. 10 Minuten) zu beenden. Wenn es immer nach demselben Zeitintervall fehlschlägt, kann das ein Hinweis sein ... – DNA

+0

Mögliches Duplikat von [Python LZMA: Komprimierte Daten wurden beendet, bevor der End-of-Stream-Marker erreicht wurde] (http://stackoverflow.com/questions/37400583/python-lzma-compressed-data-ended-vor-dem-end-of-stream-marker-was-erreicht) – kenorb

+1

Ich habe das gleiche Problem beim Versuch, mit einer sehr großen Datei online zu arbeiten mit 'urllib .request.urlopen() 'und' gzip'. Ungefähr 12 Stunden später bekomme ich eine ähnliche Rückverfolgung. – bmende

Antwort

2

vom urllib.urlopen docs:

One caveat: the read() method, if the size argument is omitted or negative, may not read until the end of the data stream; there is no good way to determine that the entire stream from a socket has been read in the general case.

Vielleicht sind die lzma.open Fahrten auf enorme Größe/Verbindungsfehler/Timeout aufgrund der oben.

2

Es ist wahrscheinlich liblzma Bug. Als Abhilfe können versuchen Sie:

lzma._BUFFER_SIZE = 1023 

vor lzma.open() Aufruf.

0

Angenommen, Sie müssen eine große Datei herunterladen, ist es besser, den Modus "Write and binary" zu verwenden, wenn Sie Inhalt in eine Datei in Python schreiben.

Sie können auch versuchen python requests Modul zu verwenden mehr als die urllib Modul:

Bitte unter einem Arbeitscode sehen:

import requests 
url="http://www.google.com" 
with open("myoutputfile.ext","wb") as f: 
    f.write(requests.get(url).content) 

Könnten Sie dieses Stück Code testen und wieder beantworten, wenn es doesn Löse dein Problem nicht.

Mit freundlichen Grüßen

2

Haben Sie versucht, die Anfragen Bibliothek? Ich glaube, es bietet eine Abstraktion über Urllib.

Die folgende Lösung sollte für Sie arbeiten, aber es verwendet die Anforderungsbibliothek anstelle von urllib (aber Anfragen> urllib sowieso!). Lassen Sie es mich wissen, wenn Sie die Verwendung von urllib weiterhin bevorzugen.

import os 
import requests 
def download(url, chunk_s=1024, fname=None): 
    if not fname: 
     fname = url.split('/')[-1] 
    req = requests.get(url, stream=True) 
    with open(fname, 'wb') as fh: 
     for chunk in req.iter_content(chunk_size=chunk_s): 
      if chunk: 
       fh.write(chunk) 
    return os.path.join(os.getcwd(), fname)