2015-04-01 7 views
8

sto scaricando un file compresso da internet:download di file di grandi dimensioni per errore python: File compresso è conclusa prima del marcatore di fine flusso è stato raggiunto

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

Dopo aver scaricato ed elaborato aa gran parte della lima, alla fine ho l'errore:

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

sto pensando che potrebbe essere causato da una connessione internet che cade o il server non risponde per qualche tempo. In tal caso, è comunque necessario continuare a provare, fino a ristabilire la connessione, anziché lanciare un'eccezione. Non penso che sia un problema con il file, in quanto ho scaricato manualmente molti file simili dallo stesso sito web e lo ho decompresso. Sono anche stato in grado di scaricare e decomprimere alcuni file più piccoli con Python. Il file che sto cercando di scaricare ha una dimensione compressa di circa 20 GB.

+0

Quanto tempo è necessario scaricare per ottenere l'errore? Alcuni firewall/proxy sembrano terminare le connessioni dopo un timeout fisso (ad esempio 10 minuti). Se fallisce sempre dopo lo stesso intervallo di tempo, potrebbe essere un indizio ... – DNA

+0

Possibile duplicato di [Python LZMA: dati compressi terminati prima del raggiungimento dell'indicatore di fine flusso] (http://stackoverflow.com/questions/37400583/python-lzma-compressed-data-ended-before-the-end-of-stream-marker-was-reached) – kenorb

+1

Sto riscontrando lo stesso problema durante il tentativo di lavorare con un file molto grande online usando 'urllib .request.urlopen() 'e' gzip'. Circa 12 ore in ho un traceback simile. – bmende

risposta

2

dal 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.

Forse i viaggi lzma.open su enormi errori di formato/connessione/timeout a causa di cui sopra.

2

Probabilmente è un bug liblzma. Per aggirare il problema prova ad aggiungere:

lzma._BUFFER_SIZE = 1023 

prima di chiamare lzma.open().

0

Supponendo che sia necessario scaricare un file di grandi dimensioni, è preferibile utilizzare la modalità "scrittura e binario" quando si scrive contenuto in un file in python.

Si può anche provare a utilizzare il modulo python requests più che il modulo urllib:

Si prega di vedere di seguito un codice di lavoro:

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

Potrebbe provare quel pezzo di codice e rispondere indietro se doesn risolvi il problema

Cordiali saluti

2

Hai provato a utilizzare la libreria delle richieste? Credo che fornisca un'astrazione su urllib.

La seguente soluzione dovrebbe funzionare per voi, ma utilizza la libreria delle richieste al posto di urllib (ma richiede comunque> urllib!). Fammi sapere se preferisci continuare a utilizzare urllib.

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