Controllare se esiste una directory e crearla se necessario?
La risposta diretta a questo è, supponendo una semplice situazione in cui non ti aspetti che altri utenti o processi stiano scherzando con la tua directory:
if not os.path.exists(d):
os.makedirs(d)
o se rendere la directory è soggetta alle condizioni di gara (cioè se dopo aver verificato il percorso esiste qualcos'altro che potrebbe averlo già fatto) fare questo:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Ma forse un approccio ancora migliore è quello di eludere il problema della contesa di risorse, usando directory temporanee tramite tempfile
:
import tempfile
d = tempfile.mkdtemp()
Ecco gli elementi essenziali del documento online:
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.
Novità in Python 3.5: pathlib.Path
conexist_ok
C'è un nuovo Path
oggetto (a partire da 3.4) con molti metodi che uno vorrebbe usare con i percorsi - uno dei quali è mkdir
.
(Per il contesto, sto monitorando il mio rappresentante settimanale con uno script. Ecco le parti rilevanti del codice dello script che mi consentono di evitare di colpire Stack Overflow più di una volta al giorno per gli stessi dati.)
Innanzitutto le importazioni rilevanti:
from pathlib import Path
import tempfile
Non dobbiamo occuparci os.path.join
ora, basta unire parti del percorso con un /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Quindi mi assicuro idempotentemente che la directory esista - l' exist_ok
argomento si presenta in Python 3.5:
directory.mkdir(exist_ok=True)
Ecco la parte rilevante della documentazione :
Se exist_ok
è vero, le FileExistsError
eccezioni verranno ignorate (stesso comportamento del POSIX mkdir -p
comando), ma solo se l'ultimo componente del percorso non è un file non di directory esistente.
Ecco un po 'di più dello script: nel mio caso, non sono soggetto a una race condition, ho solo un processo che prevede che la directory (o i file contenuti) sia lì e non ho nulla che tenti di rimuovere la directory.
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
gli oggetti devono essere forzati str
prima di altre API che si aspettanostr
percorsi possano usarli.
Forse Panda dovrebbe essere aggiornato ad accettare le istanze della classe base astratta, os.PathLike
.