2008-11-17 38 views

Trả lời

31

phiên bản chuyển thể của the script là:

#!/usr/bin/env python 
from __future__ import with_statement 
from contextlib import closing 
from zipfile import ZipFile, ZIP_DEFLATED 
import os 

def zipdir(basedir, archivename): 
    assert os.path.isdir(basedir) 
    with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z: 
     for root, dirs, files in os.walk(basedir): 
      #NOTE: ignore empty directories 
      for fn in files: 
       absfn = os.path.join(root, fn) 
       zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path 
       z.write(absfn, zfn) 

if __name__ == '__main__': 
    import sys 
    basedir = sys.argv[1] 
    archivename = sys.argv[2] 
    zipdir(basedir, archivename) 

Ví dụ:

C:\zipdir> python -mzipdir c:\tmp\test test.zip 

Nó tạo ra 'C:\zipdir\test.zip' lưu trữ với các nội dung của thư mục 'c:\tmp\test'.

+0

'ZFN = absfn [len (basedir) + len (os.sep):] 'tại sao không' absbasedir = os.path.abspath (basedir); os.path.relpath (absfn, absbasedir) '? Ngoài ra chiều dài của basedir và os.sep có thể được xem như là hằng số nên nó nằm ngoài hai vòng lặp. – n611x007

+0

chưa bao giờ nghe nói về [contextlib.closing] (http://docs.python.org/2/library/contextlib.html#contextlib.closing) trước đây, nhưng nó làm cho * với * câu lệnh tương thích ngược với ** 2.5 ** . Trước đây, tôi đã gặp lỗi với ... "với [tuyên bố] từ tương lai";), bởi vì một số hàm stdlib không hỗ trợ * với * trong * 2.5 * (ngay cả khi chính câu lệnh đó làm việc với việc nhập), trong khi hỗ trợ nó trong * 2.7 *. Tôi đoán điều này có thể tránh được với 'đóng'. – n611x007

+0

Tôi đã sử dụng giải pháp này nhưng phải sửa đổi dòng sau: zfn = absfn [len (basedir) + len (os.sep):] và trừ một vị trí là: zfn = absfn [len (basedir) + len (os.sep) -1:] nếu không tên của tệp có một chữ cái còn thiếu – jfosoriot

5

Đây là một phiên bản đệ quy

def zipfolder(path, relname, archive): 
    paths = os.listdir(path) 
    for p in paths: 
     p1 = os.path.join(path, p) 
     p2 = os.path.join(relname, p) 
     if os.path.isdir(p1): 
      zipfolder(p1, p2, archive) 
     else: 
      archive.write(p1, p2) 

def create_zip(path, relname, archname): 
    archive = zipfile.ZipFile(archname, "w", zipfile.ZIP_DEFLATED) 
    if os.path.isdir(path): 
     zipfolder(path, relname, archive) 
    else: 
     archive.write(path, relname) 
    archive.close() 
Các vấn đề liên quan