Seite 1 von 1

Über Ordnerinhalt iterieren

Verfasst: Freitag 26. Dezember 2008, 02:05
von Basilisk
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.

Verfasst: Freitag 26. Dezember 2008, 02:34
von DasIch
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.

Verfasst: Freitag 26. Dezember 2008, 02:49
von Trundle
`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.

Verfasst: Freitag 26. Dezember 2008, 09:47
von roschi

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

Verfasst: Freitag 26. Dezember 2008, 11:04
von Trundle
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.

Verfasst: Freitag 26. Dezember 2008, 11:10
von birkenfeld
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', ...]

[solved]

Verfasst: Freitag 26. Dezember 2008, 13:44
von Basilisk
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.

Verfasst: Freitag 26. Dezember 2008, 13:53
von BlackVivi
Die Einrückung is komisch ._. und... in dem Ordner sind keine Unterordner, oder?

Verfasst: Freitag 26. Dezember 2008, 15:38
von Basilisk
Nein, da sind keine Unterordner drin, deswegen habe ich mir eventuelle Tests ob ich da nun eine Datei oder einen Ordner habe, gespart.

Verfasst: Freitag 26. Dezember 2008, 17:39
von str1442

Code: Alles auswählen

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