Entpacken Sie verschachtelte Zip-Dateien in Python

Ich suche einen Weg, um verschachtelte Zip-Dateien in Python zu entpacken. Betrachten wir zum Beispiel die folgende Struktur (hypothetische Namen für die Leichtigkeit):

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

…etc. Ich versuche, auf Textdateien zuzugreifen, die sich im zweiten Zip befinden. Ich möchte sicher nicht alles herausholen, da die Scherzahlen den Computer abstürzen würden (es gibt mehrere hundert Reißverschlüsse in der ersten Schicht und fast 10.000 in der zweiten Schicht (pro Zip)).

Ich habe mit dem 'Zipfile'-Modul gespielt – ich kann die erste Stufe der Zipfiles öffnen. Z.B:

zipfile_obj = zipfile.ZipFile("/Folder/ZipfileA.zip") next_layer_zip = zipfile_obj.open("ZipfileA1.zip") 

Allerdings gibt dies eine "ZipExtFile" Instanz (keine Datei oder Zipfile-Instanz) – und ich kann dann nicht weitergehen und diesen bestimmten Datentyp öffnen. Das kann ich nicht machen:

 data = next_layer_zip.open(data.txt) 

Ich kann diese Zip-Datei auch mit "lesen"

 next_layer_zip.read() 

Aber das ist ganz nutzlos! (Dh nur komprimierte Daten / goobledigook lesen).

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

Ich stieß auf diese, http://pypi.python.org/pypi/zip_open/ – das sieht genau das aus, was ich will, aber es scheint nicht für mich zu arbeiten. (Halten Sie immer "[Errno 2] Keine solche Datei oder Verzeichnis:" für die Dateien, die ich versuche zu verarbeiten, mit diesem Modul).

Irgendwelche Ideen würden sehr geschätzt !! Danke im Voraus

4 Solutions collect form web for “Entpacken Sie verschachtelte Zip-Dateien in Python”

Leider dekomprimieren Zip-Dateien erfordert einen zufälligen Zugriff auf das Archiv, und die ZipFile Methoden (nicht zu erwähnen, die DEFLATE-Algorithmus selbst) nur Streams. Es ist daher unmöglich, verschachtelte Zip-Dateien zu dekomprimieren, ohne sie zu extrahieren.

ZipFile benötigt ein dateibasiertes Objekt, so dass Sie StringIO verwenden können, um die Daten, die Sie aus dem verschachtelten Reißverschluss lesen, in ein solches Objekt zu verwandeln. Die Einschränkung ist, dass Sie den vollen (noch komprimierten) inneren Zip in den Speicher laden werden.

 with zipfile.ZipFile('foo.zip') as z: with z.open('nested.zip') as z2: z2_filedata = cStringIO.StringIO(z2.read()) with zipfile.ZipFile(z2_filedata) as nested_zip: print nested_zip.open('data.txt').read() 

Hier ist eine Funktion, mit der ich gekommen bin.

 def extract_nested_zipfile(path, parent_zip=None): """Returns a ZipFile specified by path, even if the path contains intermediary ZipFiles. For example, /root/gparent.zip/parent.zip/child.zip will return a ZipFile that represents child.zip """ def extract_inner_zipfile(parent_zip, child_zip_path): """Returns a ZipFile specified by child_zip_path that exists inside parent_zip. """ memory_zip = StringIO() memory_zip.write(parent_zip.open(child_zip_path).read()) return zipfile.ZipFile(memory_zip) if ('.zip' + os.sep) in path: (parent_zip_path, child_zip_path) = os.path.relpath(path).split( '.zip' + os.sep, 1) parent_zip_path += '.zip' if not parent_zip: # This is the top-level, so read from disk parent_zip = zipfile.ZipFile(parent_zip_path) else: # We're already in a zip, so pull it out and recurse parent_zip = extract_inner_zipfile(parent_zip, parent_zip_path) return extract_nested_zipfile(child_zip_path, parent_zip) else: if parent_zip: return extract_inner_zipfile(parent_zip, path) else: # If there is no nesting, it's easy! return zipfile.ZipFile(path) 

Hier habe ich es getestet:

 echo hello world > hi.txt zip wrap1.zip hi.txt zip wrap2.zip wrap1.zip zip wrap3.zip wrap2.zip print extract_nested_zipfile('/Users/mattfaus/dev/dev-git/wrap1.zip').open('hi.txt').read() print extract_nested_zipfile('/Users/mattfaus/dev/dev-git/wrap2.zip/wrap1.zip').open('hi.txt').read() print extract_nested_zipfile('/Users/mattfaus/dev/dev-git/wrap3.zip/wrap2.zip/wrap1.zip').open('hi.txt').read() 

Für diejenigen, die nach einer Funktion suchen, die eine verschachtelte Zip-Datei (jede Nesting-Ebene) extrahiert und die ursprünglichen Zip-Dateien aufräumt:

 import zipfile, re, os def extract_nested_zip(zippedFile, toFolder): """ Unzip a zip file and its contents, including nested zip files Delete the zip file(s) after extraction """ with zipfile.ZipFile(zippedFile, 'r') as zfile: zfile.extractall(path=toFolder) os.remove(zippedFile) for root, dirs, files in os.walk(toFolder): for filename in files: if re.search(r'\.zip$', filename): fileSpec = os.path.join(root, filename) extract_nested_zip(fileSpec, root) 
  • Wie simuliere ich ZipFile.open in Python 2.5?
  • Warum funktioniert x, y = zip (* zip (a, b)) in Python?
  • Erstellen Sie eine Zip-Datei von einem Generator in Python?
  • Python-Skript zum Erstellen von Zip-Dateien im Remote-Server
  • Suche () eine Datei innerhalb einer Zip-Datei in Python, ohne sie in den Speicher zu übergeben
  • Warum funktioniert die Karte wie izip_longest mit fill = Keine?
  • Berechtigung zum Überschreiben von Dateien
  • Lesen Sie eine gezippte Datei als Pandas DataFrame
  • Python's Zip () Äquivalent in C oder C ++
  • Python: Reißverschluss-ähnliche Funktion, die auf längste Länge pads?
  • Warum kann nicht python ein zip-Archiv ausführen, das über stdin weitergegeben wird?
  • Python ist die beste Programmiersprache der Welt.