Prüfen Sie, ob ein Verzeichnis existiert und erstellen Sie es gegebenenfalls?
Die direkte Antwort auf diese Frage ist, dass Sie von einer einfachen Situation ausgehen, in der Sie nicht erwarten, dass andere Benutzer oder Prozesse an Ihrem Verzeichnis herumspielen:
if not os.path.exists(d):
os.makedirs(d)
o wenn das Erstellen des Verzeichnisses Wettlaufbedingungen unterliegt (d.h. wenn nach der Überprüfung der Existenz des Pfades etwas anderes es bereits erstellt haben könnte), tun Sie dies:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Aber vielleicht ist es sogar besser, das Problem der Ressourcenkonkurrenz zu umgehen, indem man temporäre Verzeichnisse über 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
con exist_ok
Es gibt eine neue Path
Objekt (ab 3.4) mit vielen Methoden, die man mit Pfaden verwenden möchte - eine davon ist mkdir
.
(Zum Vergleich: Ich verfolge meine wöchentliche Vertretung mit einem Skript. Hier sind die relevanten Teile des Codes aus dem Skript, die es mir ermöglichen, zu vermeiden, Stack Overflow mehr als einmal am Tag für dieselben Daten zu besuchen).
Zunächst zu den relevanten Einfuhren:
from pathlib import Path
import tempfile
Wir müssen uns nicht mit os.path.join
jetzt - verbinden Sie einfach Pfadteile mit einem /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Dann stelle ich idempotent sicher, dass das Verzeichnis existiert - die exist_ok
Argument taucht in Python 3.5 auf:
directory.mkdir(exist_ok=True)
Hier ist der relevante Teil der Dokumentation :
Si exist_ok
wahr ist, FileExistsError
Ausnahmen werden ignoriert (gleiches Verhalten wie bei der POSIX mkdir -p
Befehl), aber nur, wenn die letzte Pfadkomponente keine bestehende Nicht-Verzeichnisdatei ist.
Hier ist ein wenig mehr von dem Skript - in meinem Fall unterliege ich keiner Race Condition, ich habe nur einen Prozess, der erwartet, dass das Verzeichnis (oder die darin enthaltenen Dateien) vorhanden ist, und ich habe nichts, das versucht, das Verzeichnis zu entfernen.
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 dazu gezwungen werden str
vor anderen APIs, die eine str
Pfade können sie nutzen.
Vielleicht sollte Pandas aktualisiert werden, um Instanzen der abstrakten Basisklasse zu akzeptieren, os.PathLike
.
42 Stimmen
Im Allgemeinen müssen Sie den Fall berücksichtigen, dass im Dateinamen kein Verzeichnis enthalten ist. Auf meinem Rechner ergibt dirname('foo.txt') '', das nicht existiert und makedirs() zum Scheitern bringt.
9 Stimmen
Wenn der Pfad existiert, muss man nicht nur prüfen, ob es sich um ein Verzeichnis und nicht um eine normale Datei oder ein anderes Objekt handelt (viele Antworten prüfen dies), sondern auch, ob es beschreibbar ist (ich habe keine Antwort gefunden, die dies geprüft hat)
14 Stimmen
Falls Sie hierher gekommen sind, um übergeordnete Verzeichnisse einer Dateipfadzeichenkette zu erstellen
p
Hier ist mein Codeschnipsel:os.makedirs(p[:p.rindex(os.path.sep)], exist_ok=True)