entpacken von ZipVerzeichnissen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

Hallo zusammen,

habe folgendes Problem: Mein Programm soll in einem Ordner in allen gepackten (zip) Unterordner jeweils eine Datei (xml) bearbeiten können...

Hierfür würde ich gerne die Dateien entpacken und in einen temporären Ordner schreiben, um sie dann bearbeiten zu können.... Das reine Lesen der Zipverzeichnisse funktioniert nicht (Errno 13: Permission Denied), da es sich nicht um eine Datei handelt sondern eben um Verzeichnisse...

In der Pythondokumentation (2.6) finde ich nichts über diese Thema... und im Netz findet man auch nicht viel...hauptsächlich zur Bearbeitung von gepackten Dateien...

Kann mir da vielleicht jemand weiter helfen???

Gruß
Juju
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Ich verstehe das Problem nicht ganz. Es ist doch egal, ob in der Zip Dateien oder Ordner sind - du entpackst den Inhalt in ein TempDir und bearbeitest ihn da.

Kannst du bitte mal deinen Code hier einstellen? Benutzt du das zipfile-Modul oder was anderes?
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

Code: Alles auswählen

	recursive = True
	files = list()
	xml = list()
	unzipped = list()
	for root, dummy, filenames in os.walk(sys.argv[1]):
		for filename in filenames:
			files.append(os.path.join(root, filename))
		if not recursive:
			break
		for path in files:
			openzip = zipfile.ZipFile(path, 'r')
			for f in openzip.namelist(): 
				if f.endswith('PBR.xml'):  
					xml.append(f)
			print xml
Zuletzt geändert von Anonymous am Mittwoch 7. Juli 2010, 12:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@juju: Und wo genau kommt nun die Ausnahme? Und an welcher Stelle bzw. bei welchem Schleifendurchlauf?

Du verwendest übrigens Tabs statt Leerzeichen zum Einrücken.

Und `os.walk` erscheint mir hier ein wenig fragwürdig denn es sollten in den Unterverzeichnissen nur ZIP-Dateien liegen, denn Du versuchst ja ausnahmslos alles als ZIP-Datei zu öffnen.

Was willst Du denn *eigentlich* machen!?
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

es kommt keine Ausnahme...

Also: Ich möchte gerne ein Verzeichnis / Ordner untersuchen... dieser Ordner enthält viele gezippte Unterordner und in diesen Unterordner befinden sich verschiedene Dateiformate, von welchen ich nur die XML-Dateien benötige und weiter mit ihnen arbeiten möchte...
BlackJack

@juju: Wenn keine Ausnahme kommt, wo ist dann das Problem? Was funktioniert dann nicht wie erwartet?

Und hast Du da wirklich Unterordner? Also ich meine echte auf dem Dateisystem? Was *in* den ZIP-Archiven ist, wird von Dateisystemoperationen wie `os.walk()` ja nicht erfasst.

Nur zur Sicherheit würde ich vor dem öffnen als ZIP-Archiv testen ob es sich wirklich um eines handelt, oder zumindest eine eventuelle Ausnahme behandeln.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

1. Ich kann auf die einzelnen XML Dateien nicht direkt zugreifen
2. Ja das sind wirklich Unterordner -> Ich suche mit 'os.walk()' alle ZIP-Archive... der weitere Prozess findet dann mit 'zipfile.ZipFile()' statt
3. Test auf ZIP-Archiv: Naja vorher konnte nicht auf die Unterordner zugriffen werden... mit zipfile geht das schon
4. bestehendes Problem: Pfad+relevanteDateiname wird benötigt
BlackJack

@juju: Ich glaube Du hast die Grenze zwischen Dateisystem und ZIP-Archiven nicht ganz verstanden. Wenn Du eine Datei in einem ZIP-Archiv hast, gibt es keinen Pfad dorthin. Man kann nicht direkt mit einem `open()` auf eine Datei innerhalb eines Archivs zugreifen.

Darum noch einmal die Frage nach den Unterordnern. Wie sieht denn die Verzeichnisstruktur aus *ausserhalb* der Archive?

Mit `zipfile` kann man nicht auf Ordner auf Dateisystemebene zugreifen sondern nur auf ZIP-Archive.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

Es handelt sich um ein gewöhnlichen Verzeichnisbaum unter Windows:

D:\aSi\emel\QE_note\20100620\ ... hier folgen nun viele .zip Ordner

Innerhalb eines .zip Ordners befinden sich dann fünf unterschiedliche Dateien ... zb.: .xml, .txt...usw
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

BlackJack hat dich ja auf open() hingewiesen - hast du das implementiert? Wenn du nichts entpackst, kannst du auch keine Dateien einlesen. Und: ".zip" sind keine Ordner.

Du erstellst mit deinem Codeschnippsel nur eine Liste von xml-Dateien in .zip-Archiven. Um aber darauf zuzugreifen, musst du diese xml-Dateien aber entpacken - vorzugsweise mit der open()-Methode des ZipFile-Objekte.
BlackJack

@juju: Befinden sich in dem Verzeichnis D:\aSi\emel\QE_note\20100620\ nur ZIP-Archive oder auch Unterverzeichnisse in denen wiederum ZIP-Archive liegen?
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

In dem Verzeichnis befinden sich auschließlich Zip-Archive, aus denen dann die relevanten Daten extrahiert (dekomprimiert) werden sollen
BlackJack

@juju: Dann ist `os.walk()` eine Nummer zu gross/komplex, denn wenn keine Unterverzeichnisse existieren braucht man ja nur das eine Verzeichnis auflisten.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

ok... aber im Prinzip funktioniert doch auch so ??
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Naja, von os.listdir(PFAD) bekommst du einfach eine Liste mit allen Ordnern und Dateien im angegebenen Pfad, os.walk() ist dahingegen ein Generator. Prinzipiell kannst du über beides iterieren, weswegen man irgendwie schon sagen kann, dass es "ähnlich funktioniert".
Beim Iterieren über die Liste, die os.listdir() dir liefert, hast du natürlich nur ein Element - eben den Datei- oder Ordnernamen.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

Code: Alles auswählen

for root, dummy, filenames in os.walk(sys.argv[1]):
		for filename in filenames:
			files.append(os.path.join(root, filename))
		if not recursive:
			break
		for path in files:
			openzip = zipfile.ZipFile(path, 'r')
			for f in openzip.namelist(): 
				if f.endswith('PBR.xml'): 
					output.append(os.path.join(path, f))
		for item in output:
			print item
			outputList.append(open(path))
im letzten Schritt werden die Ziparchive zum lesen geöffnet.... wie komme ich denn nun am einfachsten an die xml Dateien ran??

Wenn ich os.listdir verwende -> to many values to unpack
Zuletzt geändert von juju am Donnerstag 8. Juli 2010, 14:06, insgesamt 1-mal geändert.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Zipfile

anbei ein Beispiel für das ändern einer XML Datei und verpacken einer Datei.

Hier keine echte xml datei, sonder odt. Ist aber in der Verarbeitung das gleiche.
Nachteil, wenn du eine datei in einer zipdatei ändern willst, must du alles auspacken
und neu wieder einpacken.

def zipWrite(self,filename,textvalue):

Code: Alles auswählen

        zin = zipfile.ZipFile ("%s.odt"%filename, 'r')
        zout = zipfile.ZipFile ("%s_tmp.odt"%filename, 'w')
        for item in zin.infolist():
            buffer = zin.read(item.filename)
            if (item.filename != 'content.xml'):
                zout.writestr(item, buffer)
                
        tmpContent_xml = zin.read("content.xml","r").replace("</office:text>", "%s </office:text>"%textvalue)
        zout.writestr("content.xml", tmpContent_xml)
        zin.close()
        os.remove("%s.odt"%filename)
        zout.close()
        os.rename("%s_tmp.odt"%filename, "%s.odt"%filename)
p.s. ja ist kein schöner code, ist aber auch nicht produktiv im einsatz

Grüße

Stefan
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

juju hat geschrieben:Wenn ich os.listdir verwende -> to many values to unpack
Dann solltest du dir die Rückgabewerte von os.listdir und os.walk anschauen.
Das Leben ist wie ein Tennisball.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

EyDu hat geschrieben:
juju hat geschrieben:Wenn ich os.listdir verwende -> to many values to unpack
Dann solltest du dir die Rückgabewerte von os.listdir und os.walk anschauen.
Oder sich mal die Beiträge der Menschen, die ihm hier helfen wollen, durchlesen.
Barabbas hat geschrieben:Beim Iterieren über die Liste, die os.listdir() dir liefert, hast du natürlich nur ein Element - eben den Datei- oder Ordnernamen.
Gut, hätte mich vielleicht noch deutlicher ausdrücken können - aber die Fehlermeldung ist ja jetzt auch nicht direkt un-googlebar.
Antworten