2010-10-24 19 views
6

Ho bisogno di decomprimere un archivio .ZIP. So già come decomprimerlo, ma è un file enorme e richiede un po 'di tempo per estrarlo. Come posso stampare la percentuale completa per l'estrazione? Vorrei qualcosa di simile:Monitor ZIP File Extraction Python

Extracting File 
1% Complete 
2% Complete 
etc, etc 

risposta

11

qui un esempio che si può iniziare con, non è ottimizzata:

import zipfile 

zf = zipfile.ZipFile('test.zip') 

uncompress_size = sum((file.file_size for file in zf.infolist())) 

extracted_size = 0 

for file in zf.infolist(): 
    extracted_size += file.file_size 
    print "%s %%" % (extracted_size * 100/uncompress_size) 
    zf.extract(file) 

per renderlo più bello fare questo per la stampa:

print "%s %%\r" % (extracted_size * 100/uncompress_size), 
+0

Perfetto! Questo è esattamente quello che volevo !! Grazie! –

0

ZipFile.getinfolist() genererà una serie di ZipInfo oggetti dal contenuto del file zip. Da lì puoi totalizzare il numero di byte di tutti i file nell'archivio e poi contare quanti ne hai estratti fino a quel momento, oppure puoi passare per il numero di file totali.

2

in Python 2.6 ZipFile oggetto ha un metodo di open che può aprire un file con nome in zip come oggetto file, è possibile citarlo per leggere i dati in blocchi

import zipfile 
import os 

def read_in_chunks(zf, name): 
    chunk_size= 4096 
    f = zf.open(name) 
    data_list = [] 
    total_read = 0 
    while 1: 
     data = f.read(chunk_size) 
     total_read += len(data) 
     print "read",total_read 
     if not data: 
      break 
     data_list.append(data) 

    return "".join(data_list) 

zip_file_path = r"C:\Users\anurag\Projects\untitled-3.zip" 
zf = zipfile.ZipFile(zip_file_path, "r") 
for name in zf.namelist(): 
    data = read_in_chunks(zf, name) 

Modifica: Per ottenere la dimensione totale si può fare qualcosa di simile

total_size = sum((file.file_size for file in zf.infolist())) 

Così ora è possibile stampare i progressi totale e il progresso per file, ad esempio, supponiamo di avere solo 1 grande file in formato zip, altri metodi (ad esempio contando solo le dimensioni e l'estrazione dei file) non daranno alcun progresso.

+0

Questo codice funziona benissimo! Grazie. Sai come ottenere la dimensione totale della cerniera non compressa? In questo modo posso stampare _Read xxxx di xxxxx_ –

+0

@Zachary Brown, vedi modifica –