Python zip einen Unterordner und nicht den gesamten Ordnerpfad

8

Ich habe ein Programm, um alle Inhalte in einem Ordner zu zippen. Ich habe diesen Code nicht geschrieben, aber ich habe ihn irgendwo online gefunden und benutze ihn. Ich beabsichtige, einen Ordner z. B. C: / Ordner1 / Ordner2 / Ordner3 / zu komprimieren. Ich möchte Ordner3 und alle seine Inhalte in einer Datei namens Ordner3.zip zippen. Mit dem unten stehenden Code wird der Inhalt von folder3.zip nach dem Zip-Zugriff Ordner1 / Ordner2 / Ordner3 / und Dateien sein. Ich möchte nicht, dass der gesamte Pfad gezippt wird, und ich möchte nur den Unterordner, den ich zippen möchte (in diesem Fall Ordner3). Ich habe versucht, einige os.chdir etc, aber kein Glück.

%Vor%

Sie können dies durch makeArchive(dirEntries(folder, True), zipname) aufrufen.

Irgendwelche Ideen, wie Sie dieses Problem lösen können? Ich benutze Windows OS und Python 25, ich weiß in Python 2.7 gibt es shutil make_archive, die hilft, aber da ich an 2.5 arbeite, brauche ich eine andere Lösung: - /

    
Kiran6699 21.01.2013, 12:45
quelle

2 Antworten

14

Sie müssen ein Argument arcname an ZipFile.write() verwendet einen relativen Pfad. Tun Sie dies, indem Sie den Root-Pfad angeben, der in makeArchive() :

entfernt werden soll %Vor%

und rufe dies mit:

%Vor%

Ich habe die Decke try: , except: entfernt; Hier nützt es nichts und dient nur dazu, Probleme zu verstecken, die Sie wissen wollen.

Die Funktion os.path.relpath() gibt einen Pfad relativ zu% zurück co_de%, wodurch dieser Root-Pfad effektiv aus dem Archiveintrag entfernt wird.

In Python 2.5 ist die Funktion root nicht verfügbar. Für diesen speziellen Anwendungsfall würde die folgende Ersetzung funktionieren:

%Vor%

und verwenden:

%Vor%

Beachten Sie, dass die obige Funktion relpath nur für Ihren speziellen Fall funktioniert, in dem relpath() garantiert mit filepath beginnt; Unter Windows ist der allgemeine Fall für root sehr viel komplexer. Du willst wirklich auf Python 2.6 oder neuer upgraden, wenn es überhaupt möglich ist.

    
Martijn Pieters 21.01.2013, 13:04
quelle
2

ZipFile.write hat das optionale Argument arcname . Verwenden Sie dies, um Teile des Pfades zu entfernen.

Sie können Ihre Methode wie folgt ändern:

%Vor%

Martijns Herangehensweise mit os.path ist jedoch viel eleganter.

    
Thorsten Kranz 21.01.2013 13:02
quelle

Tags und Links