2013-04-18 43 views
28

Tôi có hai tệp trong hai thư mục khác nhau, một là '/home/test/first/first.pdf', còn lại là '/home/text/second/second.pdf'. Tôi sử dụng đoạn mã sau để nén chúng:python/zip: Cách loại bỏ đường dẫn tuyệt đối trong kho lưu trữ zip nếu đường dẫn tuyệt đối cho tệp được cung cấp?

import zipfile, StringIO 
buffer = StringIO.StringIO() 
first_path = '/home/test/first/first.pdf' 
second_path = '/home/text/second/second.pdf' 
zip = zipfile.ZipFile(buffer, 'w') 
zip.write(first_path) 
zip.write(second_path) 
zip.close() 

Sau khi tôi mở file zip mà tôi tạo ra, tôi có một thư mục home trong nó, sau đó có hai thư mục con trong nó, firstsecond thì pdf các tập tin. Tôi không biết làm thế nào để bao gồm chỉ có hai tập tin pdf thay vì có đường dẫn đầy đủ nén vào kho lưu trữ zip. Tôi hy vọng tôi làm cho câu hỏi của tôi rõ ràng, xin vui lòng giúp đỡ. Cảm ơn.

Trả lời

72

Phương pháp zipfile write() hỗ trợ một cuộc tranh cãi thêm (arcname) đó là tên lưu trữ phải được lưu trữ trong file zip, do đó bạn sẽ chỉ cần thay đổi mã của bạn với:

from os.path import basename 
... 
zip.write(first_path, basename(first_path)) 
zip.write(second_path, basename(second_path)) 
zip.close() 

Khi bạn có một số thời gian rảnh rỗi đọc tài liệu cho zipfile sẽ rất hữu ích.

4

tôi nghi ngờ có thể có một giải pháp thanh lịch hơn, nhưng điều này sẽ làm việc:

def add_zip_flat(zip, filename): 
    dir, base_filename = os.path.split(filename) 
    os.chdir(dir) 
    zip.write(base_filename) 

zip = zipfile.ZipFile(buffer, 'w') 
add_zip_flat(zip, first_path) 
add_zip_flat(zip, second_path) 
zip.close() 
5

Tôi sử dụng chức năng này để nén thư mục mà không bao gồm đường dẫn tuyệt đối

import zipfile 
import os 
def zipDir(dirPath, zipPath): 
    zipf = zipfile.ZipFile(zipPath , mode='w') 
    lenDirPath = len(dirPath) 
    for root, _ , files in os.walk(dirPath): 
     for file in files: 
      filePath = os.path.join(root, file) 
      zipf.write(filePath , filePath[lenDirPath :]) 
    zipf.close() 
#end zipDir