Cómo encontrar si el directorio existe en Python

1140

En el osmódulo en Python, ¿hay alguna manera de encontrar si existe un directorio?

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False
David542
fuente
8
Una palabra de advertencia: la respuesta mejor calificada podría ser susceptible a las condiciones de la carrera. Es posible que desee realizar en su os.statlugar, para ver si el directorio existe y es un directorio en el mismo momento.
d33tah
1
@ d33tah Puede que tenga un buen punto, pero no veo una manera de usarlo os.statpara diferenciar el directorio de un archivo. Se eleva OSErrorcuando la ruta no es válida, sin importar si es un archivo o directorio. Además, cualquier código después de la verificación también es susceptible a las condiciones de carrera.
Tomáš Zato - Restablece a Monica el
44
@ TomášZato: lo que lleva a la conclusión de que es seguro realizar la operación y manejar los errores.
d33tah
2
@ David542 Agregué un caso de aclaración con pruebas de precisión para "isdir" "existe". Creo que aprenderías cualquier cosa ahora. Pero podría iluminar a nuevas personas.
GeoStoneMarten

Respuestas:

1729

Estás buscando os.path.isdir, o os.path.existssi no te importa si es un archivo o un directorio.

Ejemplo:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))
phihag
fuente
44
@syedrakib Si bien los paréntesis pueden usarse para indicar que un objeto es invocable, eso no es útil en Python, ya que incluso las clases son invocables. Además, las funciones son valores de primera clase en Python, y puede usarlas sin la notación de paréntesis, como enexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag
10
Puede pasar funciones a otras funciones, como map, pero en el caso general, llama a funciones con argumentos y paréntesis. Además, hay algún error tipográfico en su ejemplo. presumiblemente te refieres filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown
44
Además, existe os.path.isfile(path)si solo le importa si es un archivo.
Nicholas
2
Tenga en cuenta que en algunas plataformas estos devolverán falso si el archivo / directorio existe, pero también se produce un error de permiso de lectura.
cowlinator
74

¡Tan cerca! os.path.isdirdevuelve Truesi pasa el nombre de un directorio que existe actualmente. Si no existe o no es un directorio, entonces regresa False.

Kirk Strauser
fuente
70

Python 3.4 introdujo el pathlibmódulo en la biblioteca estándar, que proporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos. Los métodos is_dir()y exists()de un Pathobjeto se pueden usar para responder la pregunta:

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

Las rutas (y cadenas) se pueden unir con el /operador:

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 también está disponible en Python 2.7 a través del módulo pathlib2 en PyPi.

joelostblom
fuente
Alguna explicación sería útil. ¿Por qué estás haciendo p / 'bin' / 'vim'? "
Nathan
1
@frank elaboré un poco en la segunda parte de la respuesta.
joelostblom
34

Si, uso os.path.exists().

aganders3
fuente
23
Eso no comprueba que la ruta sea un directorio.
Kirk Strauser el
77
Buena llamada. Otros han señalado que os.path.isdirlogrará eso.
aganders3
3
Si comprende que esto no responde la pregunta, ¿por qué no elimina la respuesta?
3
@CamilStaps Esta pregunta fue vista 354000 veces (por ahora). Las respuestas aquí no son solo para OP, son para cualquiera que pueda venir aquí por cualquier razón. La respuesta de aganders3 es pertinente incluso si no resuelve directamente el problema de OP.
Gabriel
44
@Gabriel, entonces debería quedar claro en la respuesta lo que esto realmente hace.
21

Podemos verificar con 2 funciones incorporadas

os.path.isdir("directory")

Dará verdadero booleano el directorio especificado está disponible.

os.path.exists("directoryorfile")

Dará boolead verdadero si el directorio o archivo especificado está disponible.

Para verificar si la ruta es directorio;

os.path.isdir("directorypath")

dará boolean verdadero si la ruta es directorio

Vivek Ananthan
fuente
2
Esto es completamente redundante con la respuesta principal anterior.
Davis Herring
10

Como en:

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

Probablemente tirar un os.path.isdir(...)para estar seguro.

AlG
fuente
10

Solo para proporcionar la os.statversión (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
Tyler A.
fuente
7

os le ofrece muchas de estas capacidades:

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 lanzará una excepción si la ruta de entrada no es válida.

dputros
fuente
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
fuente
66
Python tiene funciones integradas para crear directorios, así que mejor uso en os.makedirs('mydir')lugar deos.system(...)
gizzmole
99
Está imprimiendo ese 'nuevo directorio creado' pero no lo sabe. ¿Qué sucede si no tiene permisos para crear un directorio? Imprimiría 'nuevo directorio ha sido creado' pero no sería cierto. Verdad.
Wojciech Jakubas
4

Hay un Unipathmódulo conveniente .

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

Otras cosas relacionadas que puede necesitar:

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

Puedes instalarlo usando pip:

$ pip3 install unipath

Es similar al incorporado pathlib. La diferencia es que trata cada ruta como una cadena ( Pathes una subclase de la str), por lo que si alguna función espera una cadena, puede pasarle fácilmente un Pathobjeto sin necesidad de convertirla en una cadena.

Por ejemplo, esto funciona muy bien con Django y settings.py:

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

También es posible que desee crear el directorio si no está allí.

Fuente , si todavía está allí en SO.

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

En Python ≥ 3.5, use pathlib.Path.mkdir:

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

Para versiones anteriores de Python, veo dos respuestas con buenas cualidades, cada una con un pequeño defecto, por lo que daré mi opinión al respecto:

Prueba os.path.existsy considera os.makedirspara la creación.

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

Como se señaló en los comentarios y en otros lugares, hay una condición de carrera: si el directorio se crea entre os.path.existsy las os.makedirsllamadas, os.makedirsfallará con un OSError. Desafortunadamente, la captura general OSErrory la continuación no son infalibles, ya que ignorará una falla al crear el directorio debido a otros factores, como permisos insuficientes, disco completo, etc.

Una opción sería atrapar OSErrory examinar el código de error incrustado (consulte ¿Hay una manera multiplataforma de obtener información del OSError de Python? ):

import os, errno

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

Alternativamente, podría haber un segundo os.path.exists, pero supongamos que otro creó el directorio después de la primera verificación, luego lo eliminó antes de la segunda, aún podríamos engañarnos.

Dependiendo de la aplicación, el peligro de las operaciones concurrentes puede ser más o menos que el peligro que representan otros factores, como los permisos de archivos. El desarrollador tendría que saber más sobre la aplicación particular que se está desarrollando y su entorno esperado antes de elegir una implementación.

Las versiones modernas de Python mejoran bastante este código, tanto al exponer FileExistsError(en 3.3+) ...

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

... y al permitir que un argumento de palabra clave que os.makedirsse llamaexist_ok (en 3.2+).

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

Dos cosas

  1. comprobar si existe el directorio?
  2. si no, cree un directorio (opcional).
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
fuente