2017-02-23 2 views
3

Ich habe eine große Zip-Datei mit vielen Dateien, die ich gerne entpacken möchte, um zu viel Speicher zu vermeiden.Entpacken Sie den Ordner nach Chunks in Python

Ich habe versucht, Python-Modul zipfile zu verwenden, aber ich habe keine Möglichkeit gefunden, das Archiv nach Chunk zu laden und auf der Festplatte zu extrahieren.

Gibt es einen einfachen Weg, das in Python zu tun?

EDIT

@ steven-rumbalski darauf richtig, dass zipfile richtig große Dateien verarbeiten, indem die Dateien nacheinander Entpacken ohne das komplette Archiv zu laden.

Mein Problem hier ist, dass meine Zip-Datei auf AWS S3 ist und dass meine EC2-Instanz eine so große Datei nicht im RAM laden kann, also lade ich sie per Chunk herunter und möchte sie Stück für Stück entpacken.

Antwort

0

können Sie verwenden zipfile (oder möglicherweise tarfile) wie folgt:

import zipfile 

def extract_chunk(fn, directory, ix_begin, ix_end): 
    with zipfile.ZipFile("{}/file.zip".format(directory), 'r') as zf: 
     infos = zf.infolist() 
     print(infos) 
     for ix in range(max(0, ix_begin), min(ix_end, len(infos))): 
       zf.extract(infos[ix], directory) 
     zf.close() 

directory = "path" 
extract_chunk("{}/file.zip".format(directory), directory, 0, 50) 
+0

Parameter 'ix_begin' und' ix_end' scheint nicht verwendet werden. (Auch das scheint zu versuchen, ein anderes Problem als die OP-Zustände zu lösen.) – 9000

4

Sie benötigen keine besondere Art und Weise ein großes Archiv auf der Festplatte zu extrahieren. Die Quelle Lib/zipfile.py zeigt, dass zipfile bereits speichereffizient ist. Beim Erstellen eines Objekts zipfile.ZipFile wird nicht die gesamte Datei in den Speicher gelesen. Es liest nur das Inhaltsverzeichnis für die ZIP-Datei ein. ZipFile.extractall() extrahiert Dateien einzeln nacheinander mit shutil.copyfileobj() Kopieren aus einer Unterklasse von io.BufferedIOBase.

Wenn alles, was Sie tun möchten, ist ein einmaliger Extraktion Python eine Verknüpfung von der Befehlszeile lautet:

python -m zipfile -e archive.zip target-dir/ 
+0

Du hast recht, Zipfile geht das ziemlich gut. Aber mein Kontext ist ein bisschen komplizierter. Der Punkt ist, dass meine ZIP-Dateien auf einem S3-Server sind und dass ich keine vollständige Zip-Datei laden kann, weil die Instanz sie nicht im RAM verarbeiten kann. Also lade ich die Zip-Datei nach Chunk herunter und entzippe sie nach Chunk – Bertrand

+2

Ich brauche keine ganze Datei im RAM. Sie müssen immer noch eine ganze Datei _on disk_ haben, da die Zip-Behandlung Suchen in der Datei erfordert. Um eine Datei auf einen Datenträger zu laden, müssen Sie sie nicht vollständig im Speicher ablegen. Es sollte ausreichen, es in Blöcken zu lesen und es in eine temporäre Datei zu schreiben und dann mit dieser Datei zu arbeiten. – 9000

+0

Thx @ 9000, du hast auch Recht. Ich habe nur erwartet, dass ich es vermeiden könnte, die Datei auf die Festplatte zu schreiben. – Bertrand

Verwandte Themen