Ein Wort der Warnung - die am höchsten bewertete Antwort ist möglicherweise anfällig für Rennbedingungen. Möglicherweise möchten Sie os.statstattdessen ausführen , um festzustellen, ob das Verzeichnis vorhanden ist und gleichzeitig ein Verzeichnis ist.
d33tah
1
@ d33tah Sie haben vielleicht einen guten Punkt, aber ich sehe keine Möglichkeit, das os.statVerzeichnis von einer Datei zu unterscheiden. Es wird ausgelöst, OSErrorwenn der Pfad ungültig ist, unabhängig davon, ob es sich um eine Datei oder ein Verzeichnis handelt. Jeder Code nach der Überprüfung ist auch anfällig für Rennbedingungen.
Tomáš Zato - Wiedereinsetzung Monica
4
@ TomášZato: Dies führt zu der Schlussfolgerung, dass es sicher ist, nur die Operation auszuführen und Fehler zu behandeln.
d33tah
2
@ David542 Ich habe einen Klärungsfall mit Präzisionstests für "isdir" "existiert" hinzugefügt. Ich denke, du würdest jetzt alles lernen. Aber es könnte neue Leute erleuchten.
GeoStoneMarten
Antworten:
1728
Du suchst os.path.isdiroderos.path.exists wenn es Ihnen egal ist, ob es sich um eine Datei oder ein Verzeichnis handelt.
Beispiel:
import os
print(os.path.isdir("/home/el"))print(os.path.exists("/home/el/myfile.txt"))
@syedrakib Während Klammern verwendet werden können, um anzuzeigen, dass ein Objekt aufrufbar ist, ist dies in Python nicht hilfreich, da sogar Klassen aufrufbar sind. Außerdem sind Funktionen in Python erstklassige Werte, und Sie können sie ohne die Klammernotation verwenden, wie inexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag
10
Sie können Funktionen an andere Funktionen übergeben, z. B. mapaber im Allgemeinen rufen Sie Funktionen mit Argumenten und Klammern auf. Außerdem enthält Ihr Beispiel einen Tippfehler. vermutlich meinst du filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
Hughdbrown
4
Es gibt auch, os.path.isfile(path)wenn Sie sich nur darum kümmern, ob es sich um eine Datei handelt.
Nicholas
2
Beachten Sie, dass diese auf einigen Plattformen false zurückgeben, wenn die Datei / das Verzeichnis vorhanden ist, aber auch ein Leseberechtigungsfehler auftritt.
Cowlinator
74
So nah! os.path.isdirGibt zurück, Truewenn Sie den Namen eines aktuell vorhandenen Verzeichnisses übergeben. Wenn es nicht existiert oder kein Verzeichnis ist, wird es zurückgegeben False.
Python 3.4 führte das pathlibModul in die Standardbibliothek ein, die einen objektorientierten Ansatz für die Verarbeitung von Dateisystempfaden bietet. Die is_dir()und exists()Methoden eines PathObjekts können verwendet werden, um die Frage zu beantworten:
In[1]:from pathlib importPathIn[2]: p =Path('/usr')In[3]: p.exists()Out[3]:TrueIn[4]: p.is_dir()Out[4]:True
Pfade (und Zeichenfolgen) können mit dem /Operator zusammengefügt werden:
In[5]: q = p /'bin'/'vim'In[6]: q
Out[6]:PosixPath('/usr/bin/vim')In[7]: q.exists()Out[7]:TrueIn[8]: q.is_dir()Out[8]:False
Das überprüft nicht, ob der Pfad ein Verzeichnis ist.
Kirk Strauser
7
Guter Anruf. Andere haben darauf hingewiesen, dass dies erreicht os.path.isdirwird.
aganders3
3
Wenn Sie verstehen, dass dies die Frage nicht beantwortet, warum entfernen Sie die Antwort nicht?
3
@CamilStaps Diese Frage wurde (bis jetzt) 354000 Mal angezeigt. Die Antworten hier sind nicht nur für OP, sondern für jeden, der aus irgendeinem Grund hierher kommen könnte. Die Antwort von aganders3 ist relevant, auch wenn sie das Problem von OP nicht direkt löst.
Gabriel
4
@ Gabriel dann sollte in der Antwort klargestellt werden, was dies tatsächlich tut.
21
Wir können mit 2 eingebauten Funktionen überprüfen
os.path.isdir("directory")
Es gibt boolean true, das angegebene Verzeichnis ist verfügbar.
os.path.exists("directoryorfile")
Es gibt boolead true, wenn das angegebene Verzeichnis oder die angegebene Datei verfügbar ist.
Um zu überprüfen, ob der Pfad ein Verzeichnis ist;
os.path.isdir("directorypath")
gibt boolean true an, wenn der Pfad Verzeichnis ist
Python hat eingebaute Funktionen zum Erstellen von Verzeichnissen, also besser verwenden os.makedirs('mydir')stattos.system(...)
Gizzmole
9
Sie drucken, dass 'neues Verzeichnis erstellt wurde', aber das wissen Sie nicht. Was ist, wenn Sie keine Berechtigung zum Erstellen eines Verzeichnisses haben? Sie würden "Neues Verzeichnis wurde erstellt" drucken , aber es wäre nicht wahr. Würde es.
Es ist ähnlich wie beim eingebauten pathlib. Der Unterschied besteht darin, dass jeder Pfad als Zeichenfolge behandelt wird ( Patheine Unterklasse von str). Wenn also eine Funktion eine Zeichenfolge erwartet, können Sie diese problemlos an a übergebenPath Objekt übergeben, ohne es in eine Zeichenfolge konvertieren zu müssen.
Dies funktioniert beispielsweise hervorragend mit Django und settings.py:
from pathlib importPathPath("/my/directory").mkdir(parents=True, exist_ok=True)
Für ältere Versionen von Python sehe ich zwei Antworten mit guten Eigenschaften, jede mit einem kleinen Fehler, also werde ich meine Meinung dazu abgeben:
import os
ifnot os.path.exists(directory):
os.makedirs(directory)
Wie in Kommentaren und an anderer Stelle erwähnt, gibt es eine Race-Bedingung - wenn das Verzeichnis zwischen dem os.path.existsund dem os.makedirsAufruf erstellt os.makedirswird, schlägt das mit einem fehl OSError. Leider ist das Abfangen OSErrorund Fortfahren von Decken nicht kinderleicht, da ein Fehler beim Erstellen des Verzeichnisses aufgrund anderer Faktoren wie unzureichender Berechtigungen, vollständiger Festplatte usw. ignoriert wird.
Alternativ könnte es eine Sekunde geben os.path.exists , aber nehmen wir an, eine andere hat das Verzeichnis nach der ersten Überprüfung erstellt und es dann vor der zweiten entfernt - wir könnten uns immer noch täuschen lassen.
Abhängig von der Anwendung kann die Gefahr gleichzeitiger Vorgänge mehr oder weniger groß sein als die Gefahr, die durch andere Faktoren wie z. B. Dateiberechtigungen entsteht. Der Entwickler müsste mehr über die jeweilige zu entwickelnde Anwendung und die erwartete Umgebung wissen, bevor er eine Implementierung auswählt.
Moderne Versionen von Python verbessern diesen Code erheblich, indem sie FileExistsError(in 3.3 +) ...
Wenn nicht, erstellen Sie ein Verzeichnis (optional).
import os
dirpath ="<dirpath>"# Replace the "<dirpath>" with actual directory path.if os.path.exists(dirpath):print("Directory exist")else:#this is optional if you want to create a directory if doesn't exist.
os.mkdir(dirpath):print("Directory created")
os.stat
stattdessen ausführen , um festzustellen, ob das Verzeichnis vorhanden ist und gleichzeitig ein Verzeichnis ist.os.stat
Verzeichnis von einer Datei zu unterscheiden. Es wird ausgelöst,OSError
wenn der Pfad ungültig ist, unabhängig davon, ob es sich um eine Datei oder ein Verzeichnis handelt. Jeder Code nach der Überprüfung ist auch anfällig für Rennbedingungen.Antworten:
Du suchst
os.path.isdir
oderos.path.exists
wenn es Ihnen egal ist, ob es sich um eine Datei oder ein Verzeichnis handelt.Beispiel:
quelle
existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
map
aber im Allgemeinen rufen Sie Funktionen mit Argumenten und Klammern auf. Außerdem enthält Ihr Beispiel einen Tippfehler. vermutlich meinst dufilter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
.os.path.isfile(path)
wenn Sie sich nur darum kümmern, ob es sich um eine Datei handelt.So nah!
os.path.isdir
Gibt zurück,True
wenn Sie den Namen eines aktuell vorhandenen Verzeichnisses übergeben. Wenn es nicht existiert oder kein Verzeichnis ist, wird es zurückgegebenFalse
.quelle
Python 3.4 führte das
pathlib
Modul in die Standardbibliothek ein, die einen objektorientierten Ansatz für die Verarbeitung von Dateisystempfaden bietet. Dieis_dir()
undexists()
Methoden einesPath
Objekts können verwendet werden, um die Frage zu beantworten:Pfade (und Zeichenfolgen) können mit dem
/
Operator zusammengefügt werden:Pathlib ist auch in Python 2.7 über das pathlib2-Modul auf PyPi verfügbar.
quelle
p / 'bin' / 'vim'
?Ja, benutze
os.path.exists()
.quelle
os.path.isdir
wird.Wir können mit 2 eingebauten Funktionen überprüfen
Es gibt boolean true, das angegebene Verzeichnis ist verfügbar.
Es gibt boolead true, wenn das angegebene Verzeichnis oder die angegebene Datei verfügbar ist.
Um zu überprüfen, ob der Pfad ein Verzeichnis ist;
os.path.isdir("directorypath")
gibt boolean true an, wenn der Pfad Verzeichnis ist
quelle
Ja, benutze os.path.isdir (Pfad)
quelle
Wie in:
Wahrscheinlich werfen Sie ein
os.path.isdir(...)
, um sicher zu sein.quelle
Nur um die
os.stat
Version (Python 2) bereitzustellen :quelle
os bietet Ihnen viele dieser Funktionen:
Das Listenverzeichnis löst eine Ausnahme aus, wenn der Eingabepfad ungültig ist.
quelle
quelle
os.makedirs('mydir')
stattos.system(...)
Es gibt ein praktisches
Unipath
Modul.Andere verwandte Dinge, die Sie möglicherweise benötigen:
Sie können es mit pip installieren:
Es ist ähnlich wie beim eingebauten
pathlib
. Der Unterschied besteht darin, dass jeder Pfad als Zeichenfolge behandelt wird (Path
eine Unterklasse vonstr
). Wenn also eine Funktion eine Zeichenfolge erwartet, können Sie diese problemlos an a übergebenPath
Objekt übergeben, ohne es in eine Zeichenfolge konvertieren zu müssen.Dies funktioniert beispielsweise hervorragend mit Django und
settings.py
:quelle
Möglicherweise möchten Sie das Verzeichnis auch erstellen, wenn es nicht vorhanden ist.
Quelle , wenn es noch auf SO da ist.
================================================== ===================
Verwenden Sie unter Python ≥ 3.5
pathlib.Path.mkdir
:Für ältere Versionen von Python sehe ich zwei Antworten mit guten Eigenschaften, jede mit einem kleinen Fehler, also werde ich meine Meinung dazu abgeben:
Versuchen Sie es
os.path.exists
und überlegen Sie es sichos.makedirs
für die Erstellung.Wie in Kommentaren und an anderer Stelle erwähnt, gibt es eine Race-Bedingung - wenn das Verzeichnis zwischen dem
os.path.exists
und demos.makedirs
Aufruf erstelltos.makedirs
wird, schlägt das mit einem fehlOSError
. Leider ist das AbfangenOSError
und Fortfahren von Decken nicht kinderleicht, da ein Fehler beim Erstellen des Verzeichnisses aufgrund anderer Faktoren wie unzureichender Berechtigungen, vollständiger Festplatte usw. ignoriert wird.Eine Möglichkeit wäre
OSError
, den eingebetteten Fehlercode abzufangen und zu untersuchen (siehe Gibt es eine plattformübergreifende Möglichkeit, Informationen von Pythons OSError abzurufen ):Alternativ könnte es eine Sekunde geben
os.path.exists
, aber nehmen wir an, eine andere hat das Verzeichnis nach der ersten Überprüfung erstellt und es dann vor der zweiten entfernt - wir könnten uns immer noch täuschen lassen.Abhängig von der Anwendung kann die Gefahr gleichzeitiger Vorgänge mehr oder weniger groß sein als die Gefahr, die durch andere Faktoren wie z. B. Dateiberechtigungen entsteht. Der Entwickler müsste mehr über die jeweilige zu entwickelnde Anwendung und die erwartete Umgebung wissen, bevor er eine Implementierung auswählt.
Moderne Versionen von Python verbessern diesen Code erheblich, indem sie
FileExistsError
(in 3.3 +) ...... und indem ein Schlüsselwortargument
os.makedirs
aufgerufen wirdexist_ok
(in 3.2+).quelle
Zwei Dinge
quelle