michahe
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Hallo, ich möchte die Anzahl der Dateien in einem Verzeichnis ermitteln:
analyze_dir = "/mnt/Daten/"
num_files = len([f for f in os.listdir(analyze_dir) if os.path.isfile(os.path.join(analyze_dir, f))])
print("num_files)
8 # Ergebnis richtig!
Jetzt ein reales Verzeichhnis:
analyze_dir = "/mnt/Daten/_Datenübernahmen/_02 > Anwendung.py/"
FileNotFoundError: [Errno 2] No such file or directory: '/mnt/Daten/_Datenübernahmen/_02 > Anwendung.py/'
Wie kann ich den Pfad "störungsfrei" übergeben?
|
karzer
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1288
Wohnort: Bad Oeynhausen
|
michahe schrieb: analyze_dir = "/mnt/Daten/_Datenübernahmen/_02 > Anwendung.py/"
Was willst du mit > Anwendung.py bezwecken? Das kann doch nie und nimmer zum Verzeichnisnamen gehören? Wenn es das Verzeichnis nicht gibt, dann gibt es das nicht, und
„störungsfrei umgehen“ kann man das nicht. Und wenn das zum Namen gehören sollte, versuche es so: analyze_dir = "/mnt/Daten/_Datenübernahmen/_02\ >\ Anwendung.py/"
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5323
|
> in Verzeichnisnamen sind zulaessig und in Python musst du das nicht escapen.
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Das Verzeichnis existiert und heißt so. Es liegt offenbar an dem . (.py); Versuch:
analyze_dir = "/mnt/Daten/_Datenübernahmen/_02 > Anwendung.py/" # alte Version
analyze_dir = "/mnt/Daten/_Datenübernahmen/_02 > Anwendung(PY)/"
2
|
karzer
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1288
Wohnort: Bad Oeynhausen
|
michahe schrieb: Das Verzeichnis existiert und heißt so. Es liegt offenbar an dem . (.py); Versuch:
analyze_dir = "/mnt/Daten/_Datenübernahmen/_02 > Anwendung.py/" # alte Version
analyze_dir = "/mnt/Daten/_Datenübernahmen/_02 > Anwendung(PY)/"
2
Das glaube ich nicht. Ich habe so ein Verzeichnis angelegt: >>> import os
>>> os.listdir("/mnt/_Daten/_02 > Anwendung.py")
['test.txt']
>>> num_files = len([f for f in os.listdir("/mnt/_Daten/_02 > Anwendung.py") if os.path.isfile(os.path.join("/mnt/_Daten/_02 > Anwendung.py", f))])
>>> num_files
1
>>>
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Ich würde das so machen:
| #!/usr/bin/env python3
import sys
from pathlib import Path
for directory in sys.argv[1:]:
p = Path(directory)
if not p.is_dir():
print("'{p}' is not a directory!", file=sys.stderr)
continue
print(d, sum(e.is_file() for e in p.iterdir()))
|
Das oder die Verzeichnisse übergibst du dem Skript als Argumente. Unabhängig davon macht es keinen Sinn Ordnernamen anzugeben, die nicht existieren.
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Danke seahawk1986, funktioniert perfekt. Da es nur um ein definiertes und existierendes Verzeichnis geht, habe ich den Code nocht "etwas" gekürzt:
directory = "/mnt/Daten/_Datenübernahmen/_02 > Anwendung.py/"
p = Path(directory)
print(sum(e.is_file() for e in p.iterdir()))
Magst Du Deinen Code noch ein wenig erläutern?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Du meinst die Generator-Expression (aka Generator Comprehension), um die Anzahl der Dateien im Verzeichnis zu zählen? Path.iterdir() ist ein Iterator, der die Elemente in einem Verzeichnis zurückgibt. Für jedes der Element wird nachgesehen, ob es eine Datei ist - in dem Fall gibt Path.is_file() True zurück, ansonsten False . Python wertet True in einem numerischen Kontext als 1 und False als 0 . sum holt sich alle verfügbaren Werte aus der Generator-Comprehension (die ihrerseits den iterdir() -Iterator durchläuft - das ist der Witz bei der Lazy Evaluation, dass Dinge erst berechnet werden, wenn sie benötigt werden) und addiert die auf.
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Danke seahawk1986, Du meinst die Generator-Expression
ja genau! Jetzt verstehe ich zumindest den Code; obwohl ich ihn leider nie und nimmer selbst erstellen könnte ...
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28951
Wohnort: WW
|
Hallo, zum Ausgangscode: os.listdir und os.path ist veraltet, Stand der Dinge ist das pathlib Modul, wie von seahawk1986 ja auch verwendet. Ist ausführlich in der Python-Doku erklärt. Comprehensions (also List Comprehensions, Generator Expressions usw.) gelten als ziemlich pythonisch und können i.d.R. (triviale) Schleifen ersetzen. Wobei der sinnvolle Übergang "Schleife oder Comprehension" unscharf ist. Such' am besten mal nach "list comprehension" - wenn du das verstanden hast (solltest du als Python Programmierer), dann sind die anderen Comprehensions auch einfach zu verstehen. Dazu gibt es u.a. auch was in der Python Doku. Gruß, noisefloor
|
karzer
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1288
Wohnort: Bad Oeynhausen
|
Lies Dir doch zu den Comprehensions (nicht nur für Lists) das hier mal durch
oder guck gleich in den Docs.
|