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.
@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.
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 importPathIn[2]: p =Path('/usr')In[3]: p.exists()Out[3]:TrueIn[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]:TrueIn[8]: q.is_dir()Out[8]:False
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.
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.
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:
from pathlib importPathPath("/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:
import os
ifnot 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.
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+) ...
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
lugar, para ver si el directorio existe y es un directorio en el mismo momento.os.stat
para diferenciar el directorio de un archivo. Se elevaOSError
cuando 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.Respuestas:
Estás buscando
os.path.isdir
, oos.path.exists
si no te importa si es un archivo o un directorio.Ejemplo:
fuente
existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
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 refieresfilter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
.os.path.isfile(path)
si solo le importa si es un archivo.¡Tan cerca!
os.path.isdir
devuelveTrue
si pasa el nombre de un directorio que existe actualmente. Si no existe o no es un directorio, entonces regresaFalse
.fuente
Python 3.4 introdujo el
pathlib
módulo en la biblioteca estándar, que proporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos. Los métodosis_dir()
yexists()
de unPath
objeto se pueden usar para responder la pregunta:Las rutas (y cadenas) se pueden unir con el
/
operador:Pathlib también está disponible en Python 2.7 a través del módulo pathlib2 en PyPi.
fuente
p / 'bin' / 'vim'
? "Si, uso
os.path.exists()
.fuente
os.path.isdir
logrará eso.Podemos verificar con 2 funciones incorporadas
Dará verdadero booleano el directorio especificado está disponible.
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
fuente
Sí, use os.path.isdir (ruta)
fuente
Como en:
Probablemente tirar un
os.path.isdir(...)
para estar seguro.fuente
Solo para proporcionar la
os.stat
versión (python 2):fuente
os le ofrece muchas de estas capacidades:
listdir lanzará una excepción si la ruta de entrada no es válida.
fuente
fuente
os.makedirs('mydir')
lugar deos.system(...)
Hay un
Unipath
módulo conveniente .Otras cosas relacionadas que puede necesitar:
Puedes instalarlo usando pip:
Es similar al incorporado
pathlib
. La diferencia es que trata cada ruta como una cadena (Path
es una subclase de lastr
), por lo que si alguna función espera una cadena, puede pasarle fácilmente unPath
objeto sin necesidad de convertirla en una cadena.Por ejemplo, esto funciona muy bien con Django y
settings.py
:fuente
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
: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.exists
y consideraos.makedirs
para la creación.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.exists
y lasos.makedirs
llamadas,os.makedirs
fallará con unOSError
. Desafortunadamente, la captura generalOSError
y 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
OSError
y examinar el código de error incrustado (consulte ¿Hay una manera multiplataforma de obtener información del OSError de Python? ):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+) ...... y al permitir que un argumento de palabra clave que
os.makedirs
se llamaexist_ok
(en 3.2+).fuente
Dos cosas
fuente