So finden Sie heraus, ob in Python ein Verzeichnis vorhanden ist

1138

Im osModul in Python, ist es eine Möglichkeit zu finden , wenn ein Verzeichnis vorhanden ist , so etwas wie:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False
David542
quelle
8
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"))
Phihag
quelle
4
@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.

Kirk Strauser
quelle
70

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 import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [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]: True

In [8]: q.is_dir()
Out[8]: False

Pathlib ist auch in Python 2.7 über das pathlib2-Modul auf PyPi verfügbar.

joelostblom
quelle
Eine Erklärung wäre hilfreich. Warum machst du " p / 'bin' / 'vim'?
Nathan
1
@frank Ich habe den zweiten Teil der Antwort etwas näher ausgeführt.
Joelostblom
34

Ja, benutze os.path.exists().

aganders3
quelle
23
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

Vivek Ananthan
quelle
2
Dies ist bei der älteren Top-Antwort völlig überflüssig.
Davis Herring
10

Wie in:

In [3]: os.path.exists('/d/temp')
Out[3]: True

Wahrscheinlich werfen Sie ein os.path.isdir(...), um sicher zu sein.

AlG
quelle
10

Nur um die os.statVersion (Python 2) bereitzustellen :

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise
Tyler A.
quelle
7

os bietet Ihnen viele dieser Funktionen:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

Das Listenverzeichnis löst eine Ausnahme aus, wenn der Eingabepfad ungültig ist.

dputros
quelle
5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')
JoboFive
quelle
6
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.
Wojciech Jakubas
4

Es gibt ein praktisches UnipathModul.

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

Andere verwandte Dinge, die Sie möglicherweise benötigen:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

Sie können es mit pip installieren:

$ pip3 install unipath

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:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'
Max Malysh
quelle
4

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:

from pathlib import Path
Path("/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:

Versuchen Sie es os.path.existsund überlegen Sie es sich os.makedirsfür die Erstellung.

import os
if not 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.

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

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

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 +) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... und indem ein Schlüsselwortargument os.makedirsaufgerufen wirdexist_ok (in 3.2+).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.
Nathan
quelle
0

Zwei Dinge

  1. Überprüfen Sie, ob das Verzeichnis vorhanden ist.
  2. 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")
Uday Kiran
quelle