Seite 1 von 1

Zip-Datei im Arbeitsspeicher öffnen

Verfasst: Sonntag 7. Juni 2015, 20:16
von Papp Nase
Hallo,

ich will eine zip-Datei entpacken und den Inhalt der entpackten Datei lesen. Bis jetzt mache ich es so:

Code: Alles auswählen

            source = os.listdir(workdir_path)
            for sepfile in source:
                if sepfile.endswith(".zip"):
                    myzip = zipfile.ZipFile(workdir_path+sepfile)
                    myzip.extractall( workdir_path )
                    myzip.close() 
Die Dateien werden auf der Festplatte entpackt. Nach der Bearbeitung muss ich die Datei wieder löschen. Das sind Schreiboperationen auf der Festplatte, die ich gerne vermeiden würde. Ich könnte ein Ram-Laufwerk erstellen, damit ich die Daten im Ram entpacken, bearbeiten und dann löschen tue. Besteht die Möglichkeit, die Dateien irgendwie mit Python im Speicher zu entpacken und dann auf die entpackten Inhalte drauf zuzugreifen?

Re: Zip-Datei im Arbeitsspeicher öffnen

Verfasst: Montag 8. Juni 2015, 06:00
von Sirius3
@Papp Nase: Für solche Fragen gibt es eine Dokumentation.

Re: Zip-Datei im Arbeitsspeicher öffnen

Verfasst: Montag 8. Juni 2015, 07:38
von Papp Nase
ok, danke für den Hinweis. Heisst das, dass die Funktion zipfile.open dann die Zip-Datei nicht auf die Festplatte extrahiert, sondern im Speicher belässt? Kann ich dann den Inhalt der Datei auch irgendwie lesen, wenn es z.B. eine Textdatei ist?

Re: Zip-Datei im Arbeitsspeicher öffnen

Verfasst: Montag 8. Juni 2015, 08:13
von Sirius3
@Papp Nase: zipfile.open gibt Dir ein ganz normales Fileobjekt zurück.

Re: Zip-Datei im Arbeitsspeicher öffnen

Verfasst: Montag 8. Juni 2015, 18:42
von Papp Nase
Sirius3 hat geschrieben:@Papp Nase: zipfile.open gibt Dir ein ganz normales Fileobjekt zurück.
Der Link, den Du mir gesendet hattest, zeigte genau auf die Funktion zipfile.open. Wenn ich die Funktion extractall mache, dann muss ich ein Zielverzeichnis angeben. Ich will aber kein physisches Zielverzeichnis auf der Festplatte angeben, sondern lediglich die Inhalte im Speicher öffnen. Es könnte doch z.B. sein, dass ich eine gezippte Textdatei habe:

c:\...\textdatei.txt.zip

Um jetzt an den Inhalt dranzukommen, mache ich:

Code: Alles auswählen

myzip = zipfile.ZipFile(workdir_path+sepfile)
myzip.extractall( workdir_path )
myzip.close() 
Kann ich das machen? Macht es dann der Computer so, dass er die Datei nicht physisch auf der Festplatte extrahiert, sondern die Extraktion im Speicher erfolgt?

Wenn ich jetzt den Text der Textdatei "textdatei.txt" in einen String kopieren möchte, muss ich die Datei öffnen und in den String einlesen. Ich möchte es doch einfach nur einlesen, ohne die Datei zu öffnen.

Code: Alles auswählen

myfile = open("textdatei.txt")
for zeile in myfile:
   print (zeile)
myfile.close()
Aus der Dokumentation werde ich noch nicht so schlau draus. Wenn ich mache:

Code: Alles auswählen

myzip = zipfile.open("textdatei.txt.zip") 
erreiche ich dann unter myzip die noch gepackte zip-Datei oder schon die ungezippte Textdatei, also dass ich dann auch machen kann:

Code: Alles auswählen

for zeile in zipfile:
   print (zeile)

Re: Zip-Datei im Arbeitsspeicher öffnen

Verfasst: Montag 8. Juni 2015, 19:00
von BlackJack
@Papp Nase: Du brauchst nicht (nur) die `open()`-Funktion aus dem `zipfile`-Modul sondern auch die `open()`-Methode auf dem `ZipFile`-Objekt. Du musst erst das ZIP-Archiv öffnen und dann auf dem Objekt die Datei in dem Archiv die Du in den Speicher lesen möchtest.

Re: Zip-Datei im Arbeitsspeicher öffnen

Verfasst: Donnerstag 11. Juni 2015, 10:12
von snafu
Für `zipfile` gibt es keine `open()`-Funktion auf Modulebene. Man erstellt üblicherweise zunächst ein `ZipFile`-Objekt, indem man den Dateinamen des Archivs an `ZipFile()` übergibt. Dann kann man auf diesem Objekt die `.open()`-Methode mit dem gesuchten Dateinamen aus dem Zip-Archiv aufrufen und erhält ein Dateiobjekt, auf dem man Leseoperationen durchführen kann.

Anwendungsbeispiel:

Code: Alles auswählen

from zipfile import ZipFile

with ZipFile('foo.zip') as archive:
    spam = archive.open('spam.txt')
    print(spam.read())
Und das würde alles nur im Speicher ablaufen. Da wird also noch nichts auf die Platte geschrieben. Für's Schreiben auf Platte (also Entpacken) gibt es `.extract()` bzw `.extractall()`.