web-dev-qa-db-fra.com

python / Zip: Comment éliminer le chemin absolu dans l'archive Zip si des chemins absolus pour les fichiers sont fournis?

J'ai deux fichiers dans deux répertoires différents, l'un est '/home/test/first/first.pdf', l'autre est '/home/text/second/second.pdf'. J'utilise le code suivant pour les compresser:

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

Après avoir ouvert le fichier Zip que j'ai créé, j'ai un dossier home dedans, puis il y a deux sous-dossiers dedans, first et second, puis le pdf des dossiers. Je ne sais pas comment inclure seulement deux fichiers pdf au lieu d'avoir zippé le chemin complet dans l'archive Zip. J'espère avoir clarifié ma question, aidez-moi. Merci.

50
Shang Wang

La méthode zipfile write () prend en charge un argument supplémentaire (arcname) qui est le nom de l'archive à stocker dans le fichier Zip, vous n'aurez donc qu'à modifier votre code avec:

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

Lorsque vous aurez du temps libre, la lecture de la documentation pour zipfile sera utile.

109
João Pinto

J'utilise cette fonction pour compresser un répertoire sans inclure le chemin absolu

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
8
himnabil

Je soupçonne qu'il pourrait y avoir une solution plus élégante, mais celle-ci devrait fonctionner:

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
shx2