Seite 1 von 1
.txt Dateien in einem Ordner zählen
Verfasst: Donnerstag 8. Januar 2009, 12:08
von py-mule
Hallo,
ich habe ein für einen Anfäner unüberwindliches Problem: Ich habe eine unbekannte Anzahl .txt Dateien in einem Unterordner eines Python Programms. Wie kann ich die Anzahl der momentan vorhandenen Dateien zählen?
zähle (c\ordner/Python/Ordner)
Gruß und vielen Dank
Verfasst: Donnerstag 8. Januar 2009, 12:13
von lunar
Verfasst: Donnerstag 8. Januar 2009, 12:16
von str1442
Code: Alles auswählen
import os
len(filter(lambda x: x.endswith(".txt"), os.listdir(ordnername)))
# Ohne len hast du gleich die Liste der Dateinamen mit .txt
# Mit Generator Expression:
len(txtdateiname for txtdateiname in os.listdir(ordnername) if txtdateiname.endswith(".txt"))
Verfasst: Donnerstag 8. Januar 2009, 12:17
von Nergal
Code: Alles auswählen
import os
Folder = "C:\\"
Counter = 0
Files = os.listdir(Folder)
for File in Files:
[Dummy, Ext] = os.path.splitext(File)
if Ext == ".txt":
Counter += 1
So würd ich es machen. Kann aber gut sein, daß es noch einfacher geht. Arbeite mit Python noch nicht wirklich lange.
/edit Zu langsam und es geht scheinbar einfacher
Verfasst: Donnerstag 8. Januar 2009, 13:42
von BlackJack
@str1442: `len()` auf Generatoren geht nicht. Da würde aber eine Lösung mit `sum()` gehen:
Code: Alles auswählen
In [81]: sum(1 for f in os.listdir('.') if f.endswith('.txt'))
Out[81]: 19
Verfasst: Donnerstag 8. Januar 2009, 14:46
von Masaru
@Nergal:
In deinem Schleifenkopf solltest Du vor dem splitten auf jeden Fall noch mit
os.path.isfile(os.path.join(Ordner, File) prüfen, ob es sich bei File tatsächlich um eine Datei handelt.
os.listdir() liefert nämlich alle Elemente aus einem Verzeichnis zurück, also neben Dateien auch: Unterordner, Mounts(#Unix) und Links(#Unix).
>>Masaru<<
Verfasst: Donnerstag 8. Januar 2009, 15:14
von str1442
Hm, hatte ich noch nie ausprobiert, aber stimmt, Danke für den Hinweis - sum(1 ist eine nette Idee
Mounts(#Unix) und Links(#Unix).
Die auch nichts anderes als Dateien / Ordner sind, aber von os.path.isfile() nicht so behandelt werden.
Verfasst: Donnerstag 8. Januar 2009, 16:34
von lunar
str1442 hat geschrieben:
Mounts(#Unix) und Links(#Unix).
Die auch nichts anderes als Dateien / Ordner sind, aber von os.path.isfile() nicht so behandelt werden.
Code: Alles auswählen
>>> os.path.islink('/home/lunar/bin/dos2unix')
True
>>> os.path.isfile('/home/lunar/bin/dos2unix')
True
Verfasst: Donnerstag 8. Januar 2009, 17:06
von str1442
Ok, bei Links funktioniert es wenn der Link auf eine Datei zeigt, ich hatte natürlich einen symbolischen Link auf einen Ordner getestet
Bei Character und Block Devices wie /dev/null oder /dev/sda1 hingegen bekomme ich False.
Verfasst: Donnerstag 8. Januar 2009, 17:20
von Masaru
... was ja auch der Erwartung entspricht
.
Verfasst: Donnerstag 8. Januar 2009, 17:44
von str1442
Im Grunde ist aber alles eine Datei was sich irgendwie über das Dateisystem erreichen lässt, insbesondere unter Unix. isfile testet auf "reguläre" Dateien, mir gings hierum:
also neben Dateien
Verfasst: Donnerstag 8. Januar 2009, 18:02
von Masaru
Ahhh .... du wolltest Korinthen kacken, eh?
Sag das doch gleich.
Verfasst: Donnerstag 8. Januar 2009, 20:15
von lunar
str1442 hat geschrieben:Im Grunde ist aber alles eine Datei was sich irgendwie über das Dateisystem erreichen lässt, insbesondere unter Unix.
Das ist jetzt ein bisschen sehr kleingeistig, und interessiert einen Programmierer im Userspace auch nur bedingt, schließlich verhalten sich Verzeichnisse und Dateien de facto unterschiedlich und werden auch mit unterschiedlichen APIs gelesen.
Verfasst: Donnerstag 8. Januar 2009, 20:39
von str1442
Mir stiess vorallem die Bezeichnung der Mounts auf, denn einerseits habe ich den Begriff direkt nie gehört und zweitens wusste ich anfangs nicht, was Masaru damit nun meint. Entweder nämlich Device Dateien (und in der Gegend um /dev gibt es eher keine "regulären" Dateien) oder gemountete Devices, also (idR) einfache Ordner. Deswegen erschien es mir wichtig, darauf hinzuweisen, daß es eben keine was auch immer für gearteten Spezial Objekte sind.
Verfasst: Freitag 30. Januar 2009, 10:20
von py-mule
Ich danke euch allen, für eure Beiträge. Die Lösung ist gefunden und funktioniert wunderbare.
@str1442: Deinen Lösungsvorschlag gefiel mir am besten und ließ sich wunderbar in mein Programm integrieren, vieln Dank!
Viele Grüße
py-mule
Verfasst: Freitag 30. Januar 2009, 10:33
von snafu
Was spicht gegen:
Code: Alles auswählen
In [1]: from glob import glob
In [2]: len(glob('*.txt'))
Out[2]: 8