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

Code: Alles auswählen

from glob import glob

print len(glob('**/*.txt'))

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 :roll:

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? :D 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
:?: