Vérifiez si un répertoire existe et créez-le si nécessaire?
La réponse directe à cela est, en supposant une situation simple où vous ne vous attendez pas à ce que d'autres utilisateurs ou processus jouent avec votre répertoire:
if not os.path.exists(d):
os.makedirs(d)
ou si la création du répertoire est soumise à des conditions de concurrence (c'est-à-dire si après vérification du chemin existe, quelque chose d'autre peut déjà l'avoir fait) faites ceci:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Mais peut-être qu'une approche encore meilleure consiste à contourner le problème de contention des ressources, en utilisant des répertoires temporaires via tempfile
:
import tempfile
d = tempfile.mkdtemp()
Voici l'essentiel du document en ligne:
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.
Nouveau dans Python 3.5: pathlib.Path
avecexist_ok
Il y a un nouvel Path
objet (à partir de 3.4) avec beaucoup de méthodes que l'on voudrait utiliser avec des chemins - dont l'un est mkdir
.
(Pour le contexte, je surveille mon représentant hebdomadaire avec un script. Voici les parties pertinentes du code du script qui me permettent d'éviter de frapper Stack Overflow plus d'une fois par jour pour les mêmes données.)
D'abord les importations concernées:
from pathlib import Path
import tempfile
Nous n'avons pas à nous occuper os.path.join
maintenant - il suffit de joindre des parties de chemin avec un /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Ensuite, je m'assure idempotamment que le répertoire existe - l' exist_ok
argument apparaît en Python 3.5:
directory.mkdir(exist_ok=True)
Voici la partie pertinente de la documentation :
Si la valeur exist_ok
est true, les FileExistsError
exceptions seront ignorées (même comportement que la POSIX mkdir -p
commande), mais uniquement si le dernier composant de chemin n'est pas un fichier non répertoire existant.
Voici un peu plus du script - dans mon cas, je ne suis pas soumis à une condition de concurrence, je n'ai qu'un seul processus qui s'attend à ce que le répertoire (ou les fichiers contenus) soit là, et je n'ai rien à essayer de supprimer le répertoire.
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
les objets doivent être contraints str
avant que d'autres API qui s'attendent à ce que les str
chemins puissent les utiliser.
Peut-être Pandas devrait être mis à jour pour accepter les instances de la classe de base abstraite, os.PathLike
.