¿Comprobar si existe un directorio y crearlo si es necesario?
La respuesta directa a esto es, suponiendo una situación simple en la que no esperes que otros usuarios o procesos estén jugando con tu directorio:
if not os.path.exists(d):
os.makedirs(d)
o si hacer el directorio está sujeto a condiciones de carrera (es decir, si después de verificar que la ruta existe, es posible que ya haya hecho algo más) haga esto:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Pero quizás un enfoque aún mejor es eludir el problema de contención de recursos, utilizando directorios temporales a través de tempfile
:
import tempfile
d = tempfile.mkdtemp()
Aquí están los elementos esenciales del documento en línea:
mkdtemp(suffix='', prefix='tmp', dir=None)
User-callable function to create and return a unique temporary
directory. The return value is the pathname of the directory.
The directory is readable, writable, and searchable only by the
creating user.
Caller is responsible for deleting the directory when done with it.
Nuevo en Python 3.5: pathlib.Path
conexist_ok
Hay un nuevo Path
objeto (a partir de 3.4) con muchos métodos que uno desearía usar con rutas, uno de los cuales es mkdir
.
(Por contexto, estoy rastreando mi representante semanal con un script. Aquí están las partes relevantes del código del script que me permiten evitar golpear Stack Overflow más de una vez al día por los mismos datos).
Primero las importaciones relevantes:
from pathlib import Path
import tempfile
No tenemos que lidiar os.path.join
ahora, solo une las partes del camino con /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Luego, me aseguro de que el directorio exista, el exist_ok
argumento se muestra en Python 3.5:
directory.mkdir(exist_ok=True)
Aquí está la parte relevante de la documentación :
Si exist_ok
es verdadero, FileExistsError
se ignorarán las excepciones (el mismo comportamiento que el POSIX mkdir -p
comando), pero solo si el último componente de la ruta no es un archivo no directorio existente.
Aquí hay un poco más del script: en mi caso, no estoy sujeto a una condición de carrera, solo tengo un proceso que espera que el directorio (o archivos contenidos) esté allí, y no tengo nada que intente eliminar El directorio.
todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
logger.info("todays_file exists: " + str(todays_file))
df = pd.read_json(str(todays_file))
Path
los objetos deben ser forzados str
antes de que otras API que esperan str
rutas puedan usarlos.
Tal vez pandas debe actualizarse para aceptar instancias de la clase base abstracta, os.PathLike
.