2010-11-12 20 views
49

tôi đã thực hiện một chức năng helper nhỏ:python mô-đun zipfile dường như không được nén tập tin của tôi

import zipfile 

def main(archive_list=[],zfilename='default.zip'): 
    print zfilename 
    zout = zipfile.ZipFile(zfilename, "w") 
    for fname in archive_list: 
     print "writing: ", fname 
     zout.write(fname) 
    zout.close() 

if __name__ == '__main__': 
    main() 

Vấn đề là tất cả các file của tôi không được NÉN! Các tệp có cùng kích thước và, hiệu quả, chỉ phần mở rộng đang được thay đổi thành ".zip" (từ ".xls" trong trường hợp này).

Tôi đang chạy python 2.5 trên winXP sp2.

Trả lời

103

Điều này là do ZipFile yêu cầu bạn chỉ định phương pháp nén. Nếu bạn không chỉ định nó, nó giả định phương thức nén là zipfile.ZIP_STORED, chỉ lưu trữ các tệp mà không cần nén chúng. Bạn cần chỉ định phương thức là zipfile.ZIP_DEFLATED. Bạn sẽ cần phải cài đặt mô-đun zlib cho điều này (mặc dù là thường là được cài đặt theo mặc định).

import zipfile 

def main(archive_list=[],zfilename='default.zip'): 
    print zfilename 
    zout = zipfile.ZipFile(zfilename, "w", zipfile.ZIP_DEFLATED) # <--- this is the change you need to make 
    for fname in archive_list: 
     print "writing: ", fname 
     zout.write(fname) 
    zout.close() 

if __name__ == '__main__': 
    main() 
+15

gì một mặc định khủng khiếp! Tại sao?! – gabe

+4

Vì mô-đun 'zlib' không phải lúc nào cũng có sẵn, đặc biệt là trong các cài đặt hộp cát. –

+1

Tôi đã gặp sự cố tương tự với các tệp zip. Tôi phải thừa nhận lỗi của tôi đã không đọc tài liệu trước khi thử mã ví dụ từ tài liệu python. Tôi nghĩ mã ví dụ nên bao gồm thông số ZIP_DEFLATED để làm cho nó ít khó hiểu hơn. –

5

Có một cách rất dễ dàng để nén một định dạng 'zip file',

sử dụng trong shutil.make_archive thư viện.

Ví dụ:

import shutil 

shutil.make_archive(file_name, 'zip', file location after compression) 

có thể xem tài liệu mở rộng hơn tại địa chỉ: https://docs.python.org/2/library/shutil.html#shutil.make_archive

Các vấn đề liên quan