Über Ordnerinhalt iterieren

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
Basilisk
User
Beiträge: 6
Registriert: Mittwoch 16. April 2008, 17:38

Hallo zusammen,
ich stehe grade vor einem Problem, was ich irgendwie nicht gelöst bekomme. Ich möchte ein kleines Skript schreiben, welches eine Textdatei verändert. Das klappt. Nun möchte ich das Skript erweitern, so dass ich nicht manuell jede Textdatei benennen muss, sondern dass es reicht, einen Pfad zu einem Ordner anzugeben, so dass alle Textdateien, die sich in diesem Ordner befinden, nacheinander bearbeitet werden.
Ist das möglich?
Ich bin bisher soweit, dass ich mit

Code: Alles auswählen

for file in os.listdir("/media/todo"):	
			dat=open(file, "r")
                        ....
eine Liste der Dateien in meinem Ordner todo hole und nun die Dateien nacheinander bearbeiten möchte.
Allerdings klappt dies nicht, da ich auf der Kommandozeile immer eine Fehlermeldung erhalte, dass die Datei index.txt nicht gefunden werden könne. Dies ist tatsächlich eine Datei in dem Ordner todo, aber wieso die Datei nicht gefunden wird verstehe ich dennoch nicht.

Wäre echt nett, wenn mir jemand weiterhelfen könnte bei meinem Problem.

Schonmal vielen Dank und Frohe Weihnachten.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wie du hier am Syntaxhighlighting im Forum erkennst ist file in Python belegt, du überschreibst dass in der Schleife dass ist keine gute Idee.

Ansonsten wäre es vielleicht sinnvoll den genauen Wortlaut der Fehlermeldung zu kennen.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

`os.listdir()` gibt eine Liste mit dem Verzeichnisinhalt zurück. Das sind zum einen nicht nur Dateien, sondern können auch Verzeichnisse etc. sein, außerdem muss man natürlich noch das "/media/todo" davor machen, wenn man damit dann weiterarbeiten will, was man mit `os.path.join()` machen kann.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

Code: Alles auswählen

import glob, os

ROOT = "/media/todo"

for filename in glob.glob("%s/*.txt" % ROOT):
    f = file(os.path.join(root, filename), "r")
    ...
``glob.glob("/media/todo/*.txt")`` gibt dir alles aus /media/todo, das auf .txt enden. dann musst du mit ``os.path.join`` '/media/todo' und den jeweiligen dateinamen zu einem pfad zusammenfuegen.

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Wobei man `os.path.join()` natürlich auch verwenden sollte, um das Argument für `glob.glob` zusammenzusetzen. Und man sollte `open()` anstatt `file()` benutzen. Und man sollte wieder beachten, dass auch `glob.glob()` nicht nur Dateien zurückgibt.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

roschi hat geschrieben:

Code: Alles auswählen

import glob, os

ROOT = "/media/todo"

for filename in glob.glob("%s/*.txt" % ROOT):
    f = file(os.path.join(root, filename), "r")
    ...
``glob.glob("/media/todo/*.txt")`` gibt dir alles aus /media/todo, das auf .txt enden. dann musst du mit ``os.path.join`` '/media/todo' und den jeweiligen dateinamen zu einem pfad zusammenfuegen.
Ausprobieren wäre sinnvoll... abgesehen davon dass ROOT nicht gleich root ist: im Fall von ``glob`` muss man nämlich den Basepath eben nicht mehr anhängen:

Code: Alles auswählen

>>> glob.glob('/tmp/*')
['/tmp/x', '/tmp/kde-gbr', ...]
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Basilisk
User
Beiträge: 6
Registriert: Mittwoch 16. April 2008, 17:38

Hey, vielen Dank für eure Antworten.
Im Endeffekt sieht meine Lösung jetzt so aus:

Code: Alles auswählen

todo_path="/media/todo"
		for filename in os.listdir(todo_path):
                         dat=open(os.path.join(todo_path, filename), "r")
                         ....
Und funktioniert.
Vielen Dank für eure Hilfen.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Die Einrückung is komisch ._. und... in dem Ordner sind keine Unterordner, oder?
Basilisk
User
Beiträge: 6
Registriert: Mittwoch 16. April 2008, 17:38

Nein, da sind keine Unterordner drin, deswegen habe ich mir eventuelle Tests ob ich da nun eine Datei oder einen Ordner habe, gespart.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Code: Alles auswählen

a = [os.path.join(dirname, filename) for filename in filter(os.path.isfile, os.listdir(dirname))]
Antworten