Löschen Sie die Datei aus zipfile mit dem ZipFile-Modul

Der einzige Weg, den ich zum Löschen einer Datei aus einer Zipfile kam, war, eine temporäre Zipfile zu erstellen, ohne dass die Datei gelöscht werden musste und sie dann in den ursprünglichen Dateinamen umbenannte.

In python 2.4 hatte die ZipInfo-Klasse ein Attribut file_offset , so dass es möglich war, eine zweite Zip-Datei zu erstellen und die Daten in eine andere Datei zu kopieren, ohne dekomprimieren / rekomprimieren.

Dieses file_offset fehlt in python 2.6, also gibt es eine andere option als das Erstellen einer anderen zipfile durch das Dekomprimieren jeder Datei und dann wieder komprimieren es wieder?

Gibt es vielleicht eine direkte Möglichkeit, eine Datei in der Zipfile zu löschen, suchte ich und fand nichts.

2 Solutions collect form web for “Löschen Sie die Datei aus zipfile mit dem ZipFile-Modul”

Das folgende Snippet hat für mich gearbeitet (löscht alle * .exe Dateien aus einem Zip Archiv):

 zin = zipfile.ZipFile ('archive.zip', 'r') zout = zipfile.ZipFile ('archve_new.zip', 'w') for item in zin.infolist(): buffer = zin.read(item.filename) if (item.filename[-4:] != '.exe'): zout.writestr(item, buffer) zout.close() zin.close() 

Wenn du alles in Erinnerung liest, kannst du die Notwendigkeit einer zweiten Datei beseitigen. Allerdings komprimiert dieses Snippet alles.

Nach genauerer Betrachtung ist der ZipInfo.header_offset der Offset vom ZipInfo.header_offset . Der Name ist irreführend, aber der Haupt-Zip-Header ist tatsächlich am Ende der Datei gespeichert. Mein Hexe-Editor bestätigt das.

Also das Problem, das Sie ausführen wird, ist folgendes: Sie müssen den Verzeichniseintrag auch im Hauptheader löschen oder es wird auf eine Datei verweisen, die nicht mehr existiert. Das Verlassen des Haupt-Headers intakt könnte funktionieren, wenn Sie den lokalen Header der Datei, die Sie auch löschen, behalten, aber ich bin mir nicht sicher. Wie hast du es mit dem alten Modul gemacht?

Ohne den Hauptheader zu modifizieren bekomme ich einen Fehler "fehlende X Bytes in Zipfile", wenn ich ihn öffne. Dies könnte Ihnen helfen, herauszufinden, wie man den Haupt-Header zu ändern.

Die Routine delete_from_zip_file from ruamel.std.zipfile ¹ erlaubt es Ihnen, eine Datei basierend auf ihrem vollständigen Pfad innerhalb des ZIP zu löschen oder auf ( re ) Patterns zu basieren. ZB können Sie alle .exe Dateien aus test.zip löschen

 from ruamel.std.zipfile import delete_from_zip_file delete_from_zip_file('test.zip', pattern='.*.exe') 

(Bitte beachten Sie den Punkt vor dem * ).

Dies funktioniert ähnlich wie die Lösung von mdm (einschließlich der Notwendigkeit für die Rekomprimierung), sondern erstellt die ZIP-Datei im Speicher (mit der Klasse InMemZipFile() ) und überschreibt die alte Datei, nachdem sie vollständig gelesen wurde.


¹ Haftungsausschluss: Ich bin der Autor dieses Pakets.

  • Erstellen Sie eine Zip-Datei von einem Generator in Python?
  • Gibt es eine Möglichkeit, ein Python-Skript auszuführen, das in einer Zip-Datei von bash ist?
  • Ziplisten in einer Liste in Python
  • Wie lese ich ausgewählte Dateien aus einem entfernten Zip-Archiv über HTTP mit Python?
  • LZ77 Kompression reservierte Bytes "<,>"
  • Python - Mechanismus, um komprimierten Dateityp zu identifizieren und zu dekomprimieren
  • Pythonische Möglichkeit, die Ausgabe der Funktion an mehrere Listen anzuhängen
  • Wie entpacke ich eine Datei mit Python 2.4?
  • Wie kann man überprüfen, ob die Zip-Datei über mehrere Archive mit python's zipfile lib aufgeteilt wird?
  • Python's Zip () Äquivalent in C oder C ++
  • Verständnis Zip-Funktion
  • Python ist die beste Programmiersprache der Welt.