Forum: PC-Programmierung mehrfach gezippte Dateien


von Liposom (Gast)


Lesenswert?

Hallo,

ich muss in Python ein Programm schreiben, mit dem ich mehrfach gezippte 
Dateien entpacken und lesen kann. Die einzelnen Datendateien sind 
gepackt und immer mehrere Datendateien sind nochmals in einem Zipfile 
zusammengefügt worden.

Beispiel:

Ebene_1:
========
Datensatz1.zip
Datensatz2.zip
Datensatz3.zip
Datensatz4.zip

Diese vier Datensätze sind nochmals zusammengepackt in der Datei

Ebene_0 (Verzeichnisname F:\Test):
==================================
Datensaetze1-4.zip
Datensaetze5-8.zip
Datensaetze9-12.zip

Zum Entzippen verwende ich die Bibliothek

import zipfile


Wie bin ich bisher vorgegangen?

Zuerst habe ich alle Zip-Dateien der Ebene 0 im Verzeichnis bestimmt und 
in einer Liste gespeichern (list_layer_0).

In einer for-Schleife gehe ich list_layer_0 durch und bestimme die 
Dateinamen der Dateien in der Ebene 1.

1
#!/usr/bin/env python
2
3
import os
4
import zipfile
5
6
# zip-file-path
7
zip_file_path = "F:\\test"
8
9
index = 0
10
11
if os.path.isdir (zip_file_path) == True:
12
    print "Verzeichnis existiert"
13
    os.chdir (zip_file_path)
14
    list_layer_0 = os.listdir (zip_file_path)
15
    # print filelist
16
    print len ( list_layer_0    )
17
    index = index + 1
18
    ucount = 0
19
    for file_in_list_layer_0 in list_layer_0:
20
        # print file_in_list_layer_0
21
        ucount = ucount+1
22
        if ucount == 1:
23
            f_0 = file (file_in_list_layer_0)
24
            z_0 = zipfile.ZipFile (f_0, "r")
25
            list_layer_1 = z_0.namelist()
26
            z_0_file = z_0.open (file_in_list_layer_0)
27
            for file_in_list_layer_1 in list_layer_1:
28
                print file_in_list_layer_1
29
                f_1 = file (file_in_list_layer_1)
30
                z_1 = zipfile.ZipFile (f_1, "r")
31
                
32
                z_1.close ()
33
                
34
            z_0.close ()
35
        
36
else:
37
    print "Verzeichnis existiert nicht"

Das "ucount" dient nur dazu, für den Testzweck eine Datei der Ebene 0 zu 
öffnen, wenn es funktioniert, kann diese if-Bedingung entfernt werden 
und es werden dann alle Dateien der Ebene 0 genommen.

Ich weis momentan nicht, wie ich das Problem angehen soll. Ich möchte 
jetzt z.B. die Datei Datensatz1.zip in Datensaetze1-4.zip öffnen und den 
Inhalt auslesen.

Die Beispiele von Python, die ich bisher gefunden habe, gehen nur davon 
aus, dass es sich nur um eine gezippte Ebene handelt. Dort könnte ich 
einfach mit einem read-Befehl den Inhalt der Datei auslesen
1
filecontent = z_0.read()

Ich müsste in der zweiten Schleife so arbeiten:
1
filecontent = z_1.read()

Da kommt aber die Fehlermeldung, dass die Datei nicht existiert.

Meine Idee wäre jetzt folgende - ich muss mir ein temporäres Verzeichnis 
erstellen, in das ich eine Datei aus der Ebene 0 nehme 
(Datensaetze1-4.zip), die in dem Temp-Verzeichnis entpacke und dann hab 
ich nur noch eine Ebene von Zip-Dateien, die ich öffnen, lesen und 
wieder schließen kann.

Gäbe es noch andere Möglichkeiten? Über ein paar Ideen oder Tipps würde 
ich mich sehr freuen.

von ich (Gast)


Lesenswert?

Ich habe mit Python noch nichts gemacht, aber eine Idee wäre vielleicht, 
die ganze Verzeichnisstruktur mit Rekursion durchzugehen. So wie man 
auch "normale", also ungepackte Verzeichnisse durchgeht, zum Anzeigen 
einer Baumstruktur beispielsweise.
Ich weiß aber nicht, ob in Python rekursive Aufrufe möglich sind.

von Liposom (Gast)


Lesenswert?

ich schrieb:
> aber eine Idee wäre vielleicht,
> die ganze Verzeichnisstruktur mit Rekursion durchzugehen.

Vielen Dank für den Tipp mit der Rekursion. Vom Gefühl her würde ich 
sagen, dass eine Rekursion zwar möglich ist, aber nur eine andere 
Variante als zwei ineinanderverschachtelte for-Schleifen ist.

Das Problem bleibt aber noch bestehen, wie greife ich auf eine Zip-Datei 
in einer Zip-Datei zu. Muss die erste Datei dazu entpackt werden oder 
nicht. Nehme ich die Lesefunktion XXX.read (), dann kommt ein Fehler 
(Bad CRC-32) und das liegt eben daran, dass die Datei in Ebene_1 ja auch 
nochmal eine zip-Datei ist.

von Karl H. (kbuchegg)


Lesenswert?

Liposom schrieb:

> Die Beispiele von Python, die ich bisher gefunden habe, gehen nur davon
> aus, dass es sich nur um eine gezippte Ebene handelt.

Ich würde eher sagen, dass diese Klasse wohl davon ausgeht, dass das 
Zip-File im Dateisystem vorliegt.

D.h. ich würde erst mal hergehen und alle Zip-Files aus dem 'Archiv' der 
Ebene 0 entpacken und als eigene Zip-Files im Dateisystem anlegen. Dann 
kann man den Entzipper reiheum auf die so gewonnenen Zip-Files anwenden.


> Meine Idee wäre jetzt folgende - ich muss mir ein temporäres Verzeichnis
> erstellen, in das ich eine Datei aus der Ebene 0 nehme
> (Datensaetze1-4.zip), die in dem Temp-Verzeichnis entpacke und dann hab
> ich nur noch eine Ebene von Zip-Dateien, die ich öffnen, lesen und
> wieder schließen kann.

klingt vernünftig.

von kopfkratzer (Gast)


Lesenswert?

Um's entpacken kommst Du nicht herum, entweder in /tmp einen 
Arbeitsordner anlegen und da entpacken und verschieben oder eine 
RAM-Disk anlegen.

von Tom K. (ez81)


Angehängte Dateien:

Lesenswert?

Karl Heinz schrieb:
> Ich würde eher sagen, dass diese Klasse wohl davon ausgeht, dass das
> Zip-File im Dateisystem vorliegt.
Man kann zwar eine Datei direkt aus einem Zipfile öffnen, ganz 
transparent ist das aber nicht, weil nicht alle Methoden implementiert 
sind:
>ZipFile.open(name[, mode[, pwd]])
>Extract a member from the archive as a file-like object (ZipExtFile).
>Note: The file-like object is read-only and provides the following methods:
>read(), readline(), readlines(), __iter__(), next().

Für viele Dinge reicht das, um es wiederum als Zip-File zu öffnen aber 
nicht, da ZipFile() seek braucht.

Ich wollte schon immer mal mit Generatoren spielen 
http://www.dabeaz.com/generators/ und dies war ein schön übersichtliches 
Problem dazu.
1
$ ./entzip0r.py 
2
/tmp/ziptests/0-4.zip|0.txt enthaelt: Ich bin 0.
3
/tmp/ziptests/0-4.zip|1-3.zip|1.zip|1.txt enthaelt: Ich bin 1.
4
/tmp/ziptests/0-4.zip|1-3.zip|2.txt enthaelt: Ich bin 2.
5
/tmp/ziptests/0-4.zip|1-3.zip|3.txt enthaelt: Ich bin 3.
6
/tmp/ziptests/0-4.zip|4.zip|4a.txt enthaelt: Ich bin 4a.
7
/tmp/ziptests/0-4.zip|4.zip|4b.txt enthaelt: Ich bin 4b.
8
/tmp/ziptests/0-4.zip|4.zip|4c.zip|4c1.txt enthaelt: Ich bin 4c1.
9
/tmp/ziptests/0-4.zip|4.zip|4c.zip|4c2.txt enthaelt: Ich bin 4c2.
10
/tmp/ziptests/111.txt enthaelt: Und ich bin 111

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.