Come scoprire se la directory esiste in Python


1139

Nel osmodulo in Python, c'è un modo per scoprire se esiste una directory, qualcosa del tipo:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
Un avvertimento: la risposta con il punteggio più alto potrebbe essere suscettibile alle condizioni di gara. Potresti voler eseguire os.statinvece, per vedere se la directory esiste sia ed è una directory nello stesso momento.
d33tah,

1
@ d33tah Potresti avere un buon punto, ma non vedo un modo per usare la os.statdirectory da un file. Si alza OSErrorquando il percorso non è valido, indipendentemente dal file o dalla directory. Inoltre, qualsiasi codice dopo il controllo è suscettibile alle condizioni di gara.
Tomáš Zato - Ripristina Monica il

4
@ TomášZato: il che porta alla conclusione che è sicuro eseguire semplicemente l'operazione e gestire gli errori.
d33tah,

2
@ David542 Ho aggiunto un caso di chiarimento con test di precisione per "isdir" "esiste". Penso che ora impareresti qualsiasi cosa. Ma potrebbe illuminare nuove persone.
GeoStoneMarten,

Risposte:


1729

Stai cercando os.path.isdir, oos.path.exists se non ti interessa se si tratta di un file o una directory.

Esempio:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib Mentre le parentesi possono essere usate per indicare che un oggetto è richiamabile, ciò non è utile in Python, poiché anche le classi sono richiamabili. Inoltre, le funzioni sono valori di prima classe in Python e puoi usarle senza la notazione tra parentesi, come inexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
È possibile passare funzioni ad altre funzioni, ad esempio map, ma nel caso generale, si chiamano funzioni con argomenti e parentesi. Inoltre, c'è qualche errore di battitura nel tuo esempio. presumibilmente vuoi dire filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown,

4
Inoltre, c'è os.path.isfile(path)se ti interessa solo se si tratta di un file.
Nicholas,

2
Tenere presente che su alcune piattaforme queste restituiranno false se esiste il file / directory, ma si verifica anche un errore di autorizzazione di lettura.
cowlinator il

74

Così vicino! os.path.isdirritorna Truese si passa il nome di una directory attualmente esistente. Se non esiste o non è una directory, restituisce False.


70

Python 3.4 ha introdotto il pathlibmodulo nella libreria standard, che fornisce un approccio orientato agli oggetti per gestire i percorsi del filesystem. I metodi is_dir()e exists()di un Pathoggetto possono essere usati per rispondere alla domanda:

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

I percorsi (e le stringhe) possono essere uniti insieme /all'operatore:

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 è disponibile anche su Python 2.7 tramite il modulo pathlib2 su PyPi.


Qualche spiegazione sarebbe utile. Perché stai facendo " p / 'bin' / 'vim'?
Nathan,

1
@frank Ho elaborato un po 'la seconda parte della risposta.
Joelostblom,

34

Sì, usa os.path.exists().


23
Ciò non controlla che il percorso sia una directory.
Kirk Strauser,

7
Ottima scelta. Altri hanno sottolineato che lo os.path.isdirfarà.
aganders3,

3
Se capisci che questo non risponde alla domanda, perché non rimuovi la risposta?

3
@CamilStaps Questa domanda è stata letta 354000 volte (ormai). Le risposte qui non sono solo per OP, ma per chiunque possa venire qui per qualsiasi motivo. La risposta di aganders3 è pertinente anche se non risolve direttamente il problema di OP.
Gabriel,

4
@Gabriel allora dovrebbe essere chiarito nella risposta cosa fa realmente.

21

Possiamo verificare con 2 funzioni integrate

os.path.isdir("directory")

Darà vero booleano la directory specificata è disponibile.

os.path.exists("directoryorfile")

Darà boolead vero se la directory o il file specificati sono disponibili.

Per verificare se il percorso è directory;

os.path.isdir("directorypath")

darà il valore booleano vero se il percorso è directory


2
Questo è del tutto ridondante con la risposta più vecchia e più efficace.
Davis Herring,


10

Come in:

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

Probabilmente lanciare a os.path.isdir(...)per essere sicuro.


10

Solo per fornire la os.statversione (python 2):

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

7

os ti offre molte di queste funzionalità:

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

listdir genererà un'eccezione se il percorso di input non è valido.


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

6
python ha funzioni incorporate per creare directory, quindi è meglio usarle al os.makedirs('mydir')posto dios.system(...)
gizzmole

9
Stai stampando che "è stata creata una nuova directory" ma non lo sai. Cosa succede se non si dispone delle autorizzazioni per creare una directory? Dovresti stampare "la nuova directory è stata creata" ma non sarebbe vero. Lo farebbe.
Wojciech Jakubas,

4

C'è un comodo Unipathmodulo.

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

Altre cose correlate di cui potresti aver bisogno:

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

Puoi installarlo usando pip:

$ pip3 install unipath

È simile al built-in pathlib. La differenza è che tratta ogni percorso come una stringa ( Pathè una sottoclasse di str), quindi se una funzione prevede una stringa, puoi facilmente passargli un Pathoggetto senza la necessità di convertirlo in una stringa.

Ad esempio, funziona alla grande con Django e settings.py:

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

4

Puoi anche creare la directory se non è presente.

Fonte , se è ancora lì su SO.

================================================== ===================

Su Python ≥ 3.5, utilizzare pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

Per le versioni precedenti di Python, vedo due risposte con buone qualità, ognuna con un piccolo difetto, quindi darò la mia opinione su di essa:

Prova os.path.existse considera os.makedirsla creazione.

import os
if not os.path.exists(directory):
    os.makedirs(directory)

Come notato nei commenti e altrove, c'è una condizione di competizione: se la directory viene creata tra os.path.existsle os.makedirschiamate e, os.makedirsfallirà con un OSError. Sfortunatamente, accattivanteOSError e il proseguimento delle non è infallibile, in quanto ignorerà un errore nella creazione della directory a causa di altri fattori, come autorizzazioni insufficienti, disco intero, ecc.

Un'opzione sarebbe quella di intercettare OSErrored esaminare il codice di errore incorporato (vedi Esiste un modo multipiattaforma per ottenere informazioni dall'OSError di Python ):

import os, errno

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

In alternativa, potrebbe esserci un secondo os.path.exists , ma supponiamo che un altro abbia creato la directory dopo il primo controllo, quindi l'ha rimossa prima del secondo - potremmo ancora essere ingannati.

A seconda dell'applicazione, il pericolo di operazioni simultanee può essere maggiore o minore del pericolo rappresentato da altri fattori come le autorizzazioni per i file. Lo sviluppatore dovrebbe sapere di più sulla particolare applicazione in fase di sviluppo e sul suo ambiente previsto prima di scegliere un'implementazione.

Le versioni moderne di Python migliorano un po 'questo codice, sia esponendo FileExistsError(in 3.3+) ...

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

... e consentendo la chiamata di un argomento di parole chiaveos.makedirsexist_ok (in 3.2+).

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

0

Due cose

  1. controlla se la directory esiste?
  2. in caso contrario, creare una directory (facoltativo).
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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.