Entpacken verschachtelte Zip-Dateien in Python

8

Ich suche nach einer Möglichkeit, verschachtelte Zip-Dateien in Python zu entpacken. Betrachten Sie zum Beispiel die folgende Struktur (hypothetische Namen für Leichtigkeit):

  • Ordner
    • ZipfileA.zip
      • ZipfileA1.zip
      • ZipfileA2.zip
    • ZipfileB.zip
      • ZipfileB1.zip
      • ZipfileB2.zip

... usw. Ich versuche auf Textdateien zuzugreifen, die sich innerhalb der zweiten Zip-Datei befinden. Ich möchte sicherlich nicht alles extrahieren, da die Scherzahlen den Computer zum Absturz bringen würden (es gibt mehrere hundert Zips in der ersten Schicht und fast 10.000 in der zweiten Schicht (pro Zip)).

Ich habe mit dem Modul 'zipfile' herumgespielt - ich kann die erste Ebene von Zipfiles öffnen. Zum Beispiel:

%Vor%

Dies gibt jedoch eine "ZipExtFile" -Instanz zurück (keine Datei- oder ZIP-Datei-Instanz) - und ich kann dann diesen speziellen Datentyp nicht öffnen und öffnen. Das kann ich nicht machen:

%Vor%

Ich kann diese Zip-Datei jedoch mit:

lesen %Vor%

Aber das ist völlig nutzlos! (d. h. kann nur komprimierte Daten / gobledigook lesen).

Hat jemand irgendwelche Ideen, wie ich das machen könnte? ( ohne mit ZipFile.extract) ??

Ich bin darauf gestoßen, Ссылка - das scheint genau das zu tun, was ich will, aber es scheint nicht für mich arbeiten. (Erhalte immer "[Errno 2] Keine solche Datei oder kein Verzeichnis:" für die Dateien, die ich mit diesem Modul zu verarbeiten versuche).

Irgendwelche Ideen würden sehr geschätzt werden !! Vielen Dank im Voraus

    
djmac 13.08.2012, 08:20
quelle

4 Antworten

8

Leider erfordert das Dekomprimieren von Zip-Dateien einen wahlfreien Zugriff auf das Archiv, und die Methoden ZipFile (ganz zu schweigen vom DEFLATE-Algorithmus selbst) stellen nur Streams bereit. Es ist daher nicht möglich, verschachtelte Zip-Dateien zu dekomprimieren, ohne sie zu extrahieren.

    
Ignacio Vazquez-Abrams 13.08.2012 08:24
quelle
5

ZipFile benötigt ein dateiähnliches Objekt, sodass Sie mit StringIO die Daten, die Sie aus der verschachtelten Zip-Datei gelesen haben, in ein solches Objekt konvertieren können. Der Vorbehalt ist, dass Sie den vollen (noch komprimierten) inneren Zip in den Speicher laden.

%Vor%     
Daniel W. Steinbrook 13.02.2013 21:33
quelle
4

Hier ist eine Funktion, die ich mir ausgedacht habe.

%Vor%

So habe ich es getestet:

%Vor%     
Matt Faus 01.07.2013 23:20
quelle
0

Für diejenigen, die nach einer Funktion suchen, die eine verschachtelte Zip-Datei extrahiert (jede Verschachtelungsebene) und die ursprünglichen ZIP-Dateien bereinigt:

%Vor%     
ronnydw 10.05.2017 14:47
quelle

Tags und Links