2013-04-18 30 views
28

İki farklı dizinde iki dosyam var, biri '/home/test/first/first.pdf', diğeri '/home/text/second/second.pdf'. Ben kodu aşağıdaki kullanın onları sıkıştırmak için: Oluşturduğum zip dosyasını açtıktan sonrapython/zip: Dosyalar için mutlak yollar sağlanmışsa, zip arşivindeki mutlak yolu nasıl önlersiniz?

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() 

, onunla ilgili bir home klasörü var, o zaman iki İçinde alt klasörler first ve second ardından pdf vardır Dosyalar. Zip arşivine sıkıştırılmış tam yol yerine yalnızca iki pdf dosyasını nasıl ekleyeceğimi bilmiyorum. Umarım sorumu netleştiririm, lütfen yardım edin. Teşekkürler.

cevap

72

zipfile yazma() metodu saklanacak arşiv adıdır ekstra argüman (arcname) destekleyen zip dosyası, sadece kodunuzu değiştirmeniz gerekir böylece: Lütfen yardımcı olacağını zipfile belgelerine okuma biraz boş zamanınız olduğunda

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

. Mutlak yolu dahil olmadan

4

Ben daha zarif bir çözüm olabilir şüpheli, ama bu çalışması gerekir:

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

Ben bir dizin zip için bu işlevi kullanın

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