2010-10-24 35 views
6

Tôi cần phải giải nén tệp nén .ZIP. Tôi đã biết làm thế nào để giải nén nó, nhưng nó là một tập tin lớn và mất một thời gian để giải nén. Làm thế nào tôi có thể in phần trăm hoàn thành cho việc khai thác? Tôi muốn một cái gì đó như thế này:Giám sát khai thác tệp ZIP Python

Extracting File 
1% Complete 
2% Complete 
etc, etc 

Trả lời

11

đây một ví dụ mà bạn có thể bắt đầu, nó không được tối ưu hóa:

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) 

để làm cho nó đẹp hơn làm điều này khi in:

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

Hoàn hảo! Đây chính là điều tôi muốn !! Cảm ơn! –

0

ZipFile.getinfolist() sẽ tạo ra một số ZipInfo đối tượng từ nội dung của file zip. Từ đó bạn có thể tổng số byte của tất cả các tệp trong kho lưu trữ và sau đó đếm số lượng tệp bạn đã trích xuất từ ​​trước đến nay hoặc bạn có thể đi theo tổng số tệp.

2

Trong python 2,6 ZipFile đối tượng có một phương pháp open có thể mở tệp có tên trong zip dưới dạng đối tượng tệp, bạn có thể khởi kiện để đọc dữ liệu trong các khối

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) 

Edit: Để có được tổng kích thước bạn có thể làm một cái gì đó như thế này

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

Vì vậy, bây giờ bạn có thể in các tiến bộ tổng và tiến bộ mỗi tập tin, ví dụ giả sử bạn chỉ có 1 tệp lớn trong zip, các phương pháp khác (ví dụ: chỉ tính kích thước tệp và trích xuất) sẽ không cung cấp bất kỳ tiến trình nào.

+0

Mã này hoạt động tuyệt vời! Cảm ơn. Làm oyu biết làm thế nào tôi sẽ nhận được tổng kích thước của zip không nén? Bằng cách đó tôi có thể in _Read xxxx của xxxxx_ –

+0

@Zachary Brown, xem chỉnh sửa –