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