2013-04-18 9 views
28

Ich habe zwei Dateien in zwei verschiedenen Verzeichnissen, eines ist '/home/test/first/first.pdf', das andere ist '/home/text/second/second.pdf'. Ich verwende folgenden Code, um sie zu komprimieren:python/zip: Wie wird der absolute Pfad im zip-Archiv entfernt, wenn absolute Pfade für Dateien zur Verfügung gestellt werden?

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 Zip-Datei öffnen, die ich erstellt, ich habe einen home Ordner drin, dann gibt es zwei Unterordner darin, first und second, dann ist die pdf Dateien. Ich weiß nicht, wie man nur zwei pdf-Dateien einbindet, anstatt den vollständigen Pfad in das Zip-Archiv gezippt zu haben. Ich hoffe, ich stelle meine Frage klar, bitte helfen Sie mir. Vielen Dank.

Antwort

72

Die zipfile Methode write() unterstützt ein zusätzliches Argument (arcname), die den Namen des Archivs in die gespeichert werden soll Zip-Datei, so dass Sie nur noch den 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 in der Dokumentation zu zipfile haben wird das Lesen hilfreich.

4

Ich vermute, es könnte eine elegantere Lösung sein, aber dieser 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

Ich benutze diese Funktion ein Verzeichnis zip ohne absoluten Pfad enthalten

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 
Verwandte Themen