it-swarm.com.de

Python / Zip: Wie entferne ich den absoluten Pfad im Zip-Archiv, wenn absolute Pfade für Dateien angegeben werden?

Ich habe zwei Dateien in zwei verschiedenen Verzeichnissen, eines ist '/home/test/first/first.pdf', der Andere ist '/home/text/second/second.pdf'. Ich benutze folgenden Code, um sie zu komprimieren:

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

Nachdem ich die von mir erstellte Zip-Datei geöffnet habe, habe ich einen Ordner home, in dem sich zwei Unterordner befinden, first und second, dann das PDF Dateien. Ich weiß nicht, wie ich nur zwei PDF-Dateien einbinden soll, anstatt den vollständigen Pfad in das Zip-Archiv zu kopieren. Ich hoffe ich mache meine Frage klar, bitte helfen Sie. Vielen Dank.

50
Shang Wang

Die Methode zipfile write () unterstützt ein zusätzliches Argument (arcname), das der Archivname ist, der in der Zip-Datei gespeichert werden soll. Sie müssten also nur Ihren Code ändern mit:

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

Wenn Sie etwas Zeit haben, ist es hilfreich, die Dokumentation für zipfile zu lesen.

109
João Pinto

Ich benutze diese Funktion, um ein Verzeichnis ohne absoluten Pfad zu komprimieren

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

Ich vermute, dass es eine elegantere Lösung gibt, aber diese sollte funktionieren:

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