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
.txt Dateien in einem Ordner zählen
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"))
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
/edit Zu langsam und es geht scheinbar einfacher
@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
@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<<
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<<
Hm, hatte ich noch nie ausprobiert, aber stimmt, Danke für den Hinweis - sum(1 ist eine nette Idee
Die auch nichts anderes als Dateien / Ordner sind, aber von os.path.isfile() nicht so behandelt werden.Mounts(#Unix) und Links(#Unix).
str1442 hat geschrieben:Die auch nichts anderes als Dateien / Ordner sind, aber von os.path.isfile() nicht so behandelt werden.Mounts(#Unix) und Links(#Unix).
Code: Alles auswählen
>>> os.path.islink('/home/lunar/bin/dos2unix')
True
>>> os.path.isfile('/home/lunar/bin/dos2unix')
True
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.
Bei Character und Block Devices wie /dev/null oder /dev/sda1 hingegen bekomme ich False.
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.str1442 hat geschrieben:Im Grunde ist aber alles eine Datei was sich irgendwie über das Dateisystem erreichen lässt, insbesondere unter Unix.
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.
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
@str1442: Deinen Lösungsvorschlag gefiel mir am besten und ließ sich wunderbar in mein Programm integrieren, vieln Dank!
Viele Grüße
py-mule
Was spicht gegen:
Code: Alles auswählen
In [1]: from glob import glob
In [2]: len(glob('*.txt'))
Out[2]: 8