Hier ist ein Beispiel für die Nutzung:
try:
with open('filename') as f:
do_stuff_that_depends_on_the_existence_of_the_file(f)
except IOError as e:
print 'Trouble opening file'
Wenn Sie die Datei mit einem beliebigen Zugriff auf alle öffnen, dann das Betriebssystem wird sichergestellt, dass die Datei vorhanden ist, sonst wird es mit einem Fehler fehl. Wenn der Zugriff exklusiv ist, wird jeder andere konkurrierende Prozess für die Datei entweder von Ihnen blockiert oder blockiert.
Die try
ist nur eine Möglichkeit, den Fehler oder Erfolg des Öffnens der Datei zu erkennen, da Datei-I/O-APIs in Python normalerweise keine Rückgabecodes haben (Ausnahmen werden stattdessen verwendet). Um Ihre Frage wirklich zu beantworten, ist es nicht die try
, die die Race Condition vermeidet, es ist die open
. Es ist im Grunde dasselbe in C (auf dem Python basiert), aber ohne Ausnahmen. Lesen Sie this für weitere Informationen.
Beachten Sie, dass Sie wahrscheinlich Code ausführen möchten, der vom Zugriff auf die Datei im try-Block abhängt. Sobald Sie die Datei schließen, ist ihre Existenz nicht mehr garantiert.
Aufruf os.path.exists
gibt nur einen Snapshot zu einem Zeitpunkt, wenn die Datei möglicherweise nicht vorhanden ist, und Sie haben keine Kenntnis von der Existenz der Datei, sobald os.path.exists
zurückgibt. Falscher Code oder unerwartete Logik kann die Datei löschen oder ändern, wenn Sie sie nicht erwarten. Es ist vergleichbar damit, den Kopf zu drehen, um zu prüfen, ob eine Straße frei ist, bevor man hineinfährt. Sobald Sie Ihren Kopf zurückdrehen, haben Sie nichts als eine Vermutung darüber, was dort vor sich geht, wo Sie nicht länger hinsehen. Das Offenhalten der Datei garantiert einen erweiterten konsistenten Zustand, was beim Fahren nicht möglich ist (gut oder schlecht). :)
Ihr Vorschlag zu überprüfen, dass eine Datei nicht existiert, anstatt try/open
zu verwenden, ist immer noch nicht ausreichend wegen der Snapshot-Natur von os.path.exists
. Leider kann ich nicht verhindern, dass Dateien in jedem Fall in einem Verzeichnis erstellt werden. Daher denke ich, dass es besser ist, nach der positiven Existenz einer Datei zu suchen, als nach ihrer Abwesenheit.
@ downvoter - Argumentation? Gibt es ein Problem? – Mike