.txt Dateien in einem Ordner zählen

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
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

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
lunar

Code: Alles auswählen

from glob import glob

print len(glob('**/*.txt'))
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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"))
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

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 :)
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
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

@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<<
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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.
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
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ok, bei Links funktioniert es wenn der Link auf eine Datei zeigt, ich hatte natürlich einen symbolischen Link auf einen Ordner getestet :roll:

Bei Character und Block Devices wie /dev/null oder /dev/sda1 hingegen bekomme ich False.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

... was ja auch der Erwartung entspricht ;).
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Ahhh .... du wolltest Korinthen kacken, eh? :D Sag das doch gleich.
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.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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.
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was spicht gegen:

Code: Alles auswählen

In [1]: from glob import glob

In [2]: len(glob('*.txt'))
Out[2]: 8
:?:
Antworten