Überprüfen Sie, ob ein Verzeichnis vorhanden ist, und erstellen Sie es gegebenenfalls?
Die direkte Antwort darauf lautet unter der Annahme einer einfachen Situation, in der Sie nicht erwarten, dass andere Benutzer oder Prozesse mit Ihrem Verzeichnis herumspielen:
if not os.path.exists(d):
os.makedirs(d)
oder wenn das Erstellen des Verzeichnisses den Rennbedingungen unterliegt (dh wenn nach Überprüfung des vorhandenen Pfads bereits etwas anderes erstellt wurde), gehen Sie folgendermaßen vor:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Ein vielleicht noch besserer Ansatz besteht darin, das Problem der Ressourcenkonflikte zu umgehen, indem temporäre Verzeichnisse über Folgendes verwendet werden tempfile
:
import tempfile
d = tempfile.mkdtemp()
Hier sind die wichtigsten Informationen aus dem Online-Dokument:
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.
Neu in Python 3.5: pathlib.Path
mitexist_ok
Es gibt ein neues Path
Objekt (ab 3.4) mit vielen Methoden, die man mit Pfaden verwenden möchte - eine davon ist mkdir
.
(Für den Kontext verfolge ich meine wöchentliche Wiederholung mit einem Skript. Hier sind die relevanten Teile des Codes aus dem Skript, mit denen ich vermeiden kann, mehr als einmal am Tag auf den Stapelüberlauf für dieselben Daten zu stoßen.)
Zunächst die relevanten Importe:
from pathlib import Path
import tempfile
Wir müssen uns jetzt nicht darum kümmern os.path.join
- verbinden Sie einfach Pfadteile mit einem /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Dann stelle ich idempotent sicher, dass das Verzeichnis existiert - das exist_ok
Argument wird in Python 3.5 angezeigt:
directory.mkdir(exist_ok=True)
Hier ist der relevante Teil der Dokumentation :
Wenn dies der exist_ok
Fall ist, werden FileExistsError
Ausnahmen ignoriert (dasselbe Verhalten wie beim POSIX mkdir -p
Befehl), jedoch nur, wenn die letzte Pfadkomponente keine vorhandene Nichtverzeichnisdatei ist.
Hier ist ein wenig mehr vom Skript - in meinem Fall unterliegt ich keiner Race-Bedingung, ich habe nur einen Prozess, der erwartet, dass das Verzeichnis (oder die enthaltenen Dateien) vorhanden ist, und ich habe nichts, was versucht, es zu entfernen das Verzeichnis.
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
Objekte müssen erzwungen werden, str
bevor andere APIs, die str
Pfade erwarten, sie verwenden können.
Vielleicht sollten Pandas aktualisiert werden, um Instanzen der abstrakten Basisklasse zu akzeptieren os.PathLike
.