2013-04-18 25 views
28

Ho due file in due diverse directory, uno è '/home/test/first/first.pdf', l'altro è '/home/text/second/second.pdf'. Io uso seguente codice di comprimerli:python/zip: come eliminare il percorso assoluto nell'archivio zip se vengono forniti percorsi assoluti per i file?

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

Dopo ho aperto il file zip che ho creato, ho una cartella home in esso, poi ci sono due sotto-cartelle in essa, first e second, poi il pdf File. Non so come includere solo due file pdf invece di avere il percorso completo compresso nell'archivio zip. Spero di chiarire la mia domanda, per favore aiutatemi. Grazie.

risposta

72

Il metodo write file zip() supporta un argomento extra (arcname), che è il nome dell'archivio da memorizzare nella file zip, così si avrebbe solo bisogno di modificare il codice con:

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

Quando si ha del tempo libero leggendo la documentazione per zipfile sarà utile.

4

ho il sospetto che ci potrebbe essere una soluzione più elegante, ma questo dovrebbe funzionare:

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

Io uso questa funzione per comprimere una directory senza includere percorso assoluto

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