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