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
entpacken von ZipVerzeichnissen
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?
Kannst du bitte mal deinen Code hier einstellen? Benutzt du das zipfile-Modul oder was anderes?
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.
Grund: Quelltext in Python-Code-Tags gesetzt.
@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!?
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!?
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...
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...
@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.
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.
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
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
@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.
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.
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
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
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.
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.
@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: Dann ist `os.walk()` eine Nummer zu gross/komplex, denn wenn keine Unterverzeichnisse existieren braucht man ja nur das eine Verzeichnis auflisten.
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.
Beim Iterieren über die Liste, die os.listdir() dir liefert, hast du natürlich nur ein Element - eben den Datei- oder Ordnernamen.
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))
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.
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):
p.s. ja ist kein schöner code, ist aber auch nicht produktiv im einsatz
Grüße
Stefan
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)
Grüße
Stefan
Oder sich mal die Beiträge der Menschen, die ihm hier helfen wollen, durchlesen.EyDu hat geschrieben:Dann solltest du dir die Rückgabewerte von os.listdir und os.walk anschauen.juju hat geschrieben:Wenn ich os.listdir verwende -> to many values to unpack
Gut, hätte mich vielleicht noch deutlicher ausdrücken können - aber die Fehlermeldung ist ja jetzt auch nicht direkt un-googlebar.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.