7118 Stimmen

Wie kann ich überprüfen, ob eine Datei ohne Ausnahmen existiert?

Wie prüfe ich, ob eine Datei existiert oder nicht, ohne die try Aussage?

16 Stimmen

Um zu prüfen, ob ein Path-Objekt existiert, unabhängig davon, ob es sich um eine Datei oder ein Verzeichnis handelt, verwenden Sie my_path.exists() .

1 Stimmen

my_path.exists() ist nicht ausreichend. my_path.is_file() wird Ihnen sagen, ob es sich um eine Datei handelt (könnte zum Lesen gut sein). Aber wenn Sie die Datei erstellen wollen, müssen Sie auch prüfen exists schließen Sie also Verzeichnisse oder andere Dinge im Dateisystem, die keine Dateien sind, aus, die den Fehler verursachen.

0 Stimmen

Verwenden Sie os.path.isfile, um nur Dateien zu prüfen, und verwenden Sie os.path.exists, um sowohl Dateien als auch Verzeichnisse zu prüfen. Mehr dazu erfahren Sie hier: shortbuzz.in/blog/shortbuzz.in/

77voto

chad Punkte 1279

Es scheint keinen bedeutenden funktionalen Unterschied zwischen try/except und isfile() Sie sollten also das verwenden, was am sinnvollsten ist.

Wenn Sie eine Datei lesen wollen, falls sie existiert, tun Sie

try:
    f = open(filepath)
except IOError:
    print 'Oh dear.'

Wenn Sie aber eine Datei nur umbenennen wollen, wenn sie existiert, und sie deshalb nicht öffnen müssen, tun Sie

if os.path.isfile(filepath):
    os.rename(filepath, filepath + '.old')

Wenn Sie in eine Datei schreiben wollen, die nicht existiert, tun Sie

# python 2
if not os.path.isfile(filepath):
    f = open(filepath, 'w')

# python 3, x opens for exclusive creation, failing if the file already exists
try:
    f = open(filepath, 'wx')
except IOError:
    print 'file already exists'

Wenn Sie eine Dateisperre benötigen, ist das eine andere Sache.

5 Stimmen

Diese Antwort ist falsch. os.path.exists liefert true für Dinge, die keine Dateien sind, wie z. B. Verzeichnisse. Dies führt zu falsch positiven Ergebnissen. Siehe die anderen Antworten, die empfehlen os.path.isfile .

6 Stimmen

In Ihrem dritten Beispiel erstelle ich einen Link namens filepath mit dem richtigen Timing, und BAM , überschreiben Sie die Zieldatei. Das sollten Sie tun open(filepath, 'wx') in einem try...except Block, um das Problem zu vermeiden.

1 Stimmen

In Ihrem zweiten Beispiel erhalten Sie, zumindest unter Windows, eine OSError もし filepath + '.old' bereits existiert: "Unter Windows wird ein OSError ausgelöst, wenn dst bereits existiert, selbst wenn es sich um eine Datei handelt; es gibt möglicherweise keine Möglichkeit, ein atomares Umbenennen zu implementieren, wenn dst den Namen einer bestehenden Datei trägt."

67voto

philberndt Punkte 1090

Sie könnten dies (sicherer) versuchen:

try:
    # http://effbot.org/zone/python-with-statement.htm
    # 'with' is safer to open a file
    with open('whatever.txt') as fh:
        # Do something with 'fh'
except IOError as e:
    print("({})".format(e))

Das Ergebnis wäre:

([Errno 2] No such file or directory: 'whatever.txt')

Je nach Ergebnis kann Ihr Programm von dort aus weiterlaufen oder Sie können einen Code eingeben, um es zu stoppen, wenn Sie wollen.

22 Stimmen

In der ursprünglichen Frage wurde nach einer Lösung gefragt, bei der keine try

8 Stimmen

Diese Antwort geht am Thema des OP vorbei. Zu prüfen, ob eine Datei existiert, ist nicht dasselbe wie zu prüfen, ob man sie öffnen kann. Es wird Fälle geben, in denen eine Datei zwar existiert, aber aus einer Vielzahl von Gründen nicht geöffnet werden kann.

56voto

AbstProcDo Punkte 17041

Datum:2017-12-04

Alle möglichen Lösungen wurden bereits in anderen Antworten genannt.

Eine intuitive und vertretbare Methode, um zu prüfen, ob eine Datei existiert, ist die folgende:

import os
os.path.isfile('~/file.md')  # Returns True if exists, else False
# additionaly check a dir
os.path.isdir('~/folder')  # Returns True if the folder exists, else False
# check either a dir or a file
os.path.exists('~/file')

Ich habe einen ausführlichen Spickzettel zu Ihrer Information erstellt:

#os.path methods in exhaustive cheatsheet
{'definition': ['dirname',
               'basename',
               'abspath',
               'relpath',
               'commonpath',
               'normpath',
               'realpath'],
'operation': ['split', 'splitdrive', 'splitext',
               'join', 'normcase'],
'compare': ['samefile', 'sameopenfile', 'samestat'],
'condition': ['isdir',
              'isfile',
              'exists',
              'lexists'
              'islink',
              'isabs',
              'ismount',],
 'expand': ['expanduser',
            'expandvars'],
 'stat': ['getatime', 'getctime', 'getmtime',
          'getsize']}

54voto

Zizouz212 Punkte 4728

Obwohl ich immer empfehle, die try y except Anweisungen, hier sind einige Möglichkeiten für Sie (mein persönlicher Favorit ist die Verwendung von os.access ):

  1. Versuchen Sie, die Datei zu öffnen:

    Beim Öffnen der Datei wird immer überprüft, ob die Datei vorhanden ist. Sie können eine Funktion wie die folgende erstellen:

    def File_Existence(filepath):
        f = open(filepath)
        return True

    Wenn er False ist, wird die Ausführung mit einem unbearbeiteten IOError abgebrochen. oder OSError in späteren Versionen von Python. Um die Ausnahme abzufangen, müssen Sie eine Try-Exceptions-Klausel verwenden. Natürlich können Sie auch verwenden try except"-Anweisung wie folgt (Dank an hsandt weil sie mich zum Nachdenken gebracht haben):

    def File_Existence(filepath):
        try:
            f = open(filepath)
        except IOError, OSError: # Note OSError is for later versions of Python
            return False
    
        return True
  2. Utilice os.path.exists(path) :

    Damit wird das Vorhandensein der von Ihnen angegebenen Daten überprüft. Es wird jedoch nach Dateien gesucht und Verzeichnisse, also seien Sie vorsichtig, wie Sie es verwenden.

    import os.path
    >>> os.path.exists("this/is/a/directory")
    True
    >>> os.path.exists("this/is/a/file.txt")
    True
    >>> os.path.exists("not/a/directory")
    False
  3. Utilice os.access(path, mode) :

    Damit wird geprüft, ob Sie Zugriff auf die Datei haben. Es prüft die Berechtigungen. Basierend auf der os.py-Dokumentation kann die Eingabe von os.F_OK wird geprüft, ob der Pfad existiert. Dadurch entsteht jedoch eine Sicherheitslücke, da jemand Ihre Datei in der Zeit zwischen der Überprüfung der Berechtigungen und dem Öffnen der Datei angreifen kann. Sie sollten stattdessen direkt zum Öffnen der Datei übergehen, anstatt die Berechtigungen zu prüfen. ( EAFP gegen LBYP ). Wenn Sie die Datei anschließend nicht öffnen, sondern nur ihre Existenz überprüfen wollen, können Sie dies verwenden.

    Wie auch immer, hier:

    >>> import os
    >>> os.access("/is/a/file.txt", os.F_OK)
    True

Ich sollte auch erwähnen, dass es zwei Möglichkeiten gibt, das Vorhandensein einer Datei nicht überprüfen zu können. Entweder ist das Problem permission denied o no such file or directory . Wenn Sie eine IOError setzen Sie die IOError as e (wie meine erste Option), und geben Sie dann ein print(e.args) so dass Sie hoffentlich Ihr Problem feststellen können. Ich hoffe, es hilft! :)

44voto

bergercookie Punkte 2243

Wenn die Datei zum Öffnen bestimmt ist, können Sie eine der folgenden Techniken anwenden:

with open('somefile', 'xt') as f: #Using the x-flag, Python3.3 and above
    f.write('Hello\n')

if not os.path.exists('somefile'): 
    with open('somefile', 'wt') as f:
        f.write("Hello\n")
else:
    print('File already exists!')

アップデイト

Nur um Verwirrung zu vermeiden und basierend auf den Antworten, die ich erhalten habe, findet die aktuelle Antwort entweder eine Datei o ein Verzeichnis mit dem angegebenen Namen.

10 Stimmen

Diese Antwort ist falsch. os.path.exists liefert true für Dinge, die keine Dateien sind, wie z. B. Verzeichnisse. Dies führt zu falsch positiven Ergebnissen. Siehe die anderen Antworten, die empfehlen os.path.isfile .

0 Stimmen

Hat auch das Problem der falsch positiven Ergebnisse.

0 Stimmen

docs.python.org/3/Bibliothek/os.path.html#os.path.exists Zu der obigen Aussage von chris >>os.path.exists(path) > Gibt True zurück, wenn path auf einen vorhandenen Pfad oder einen offenen Dateideskriptor verweist. Gibt False für defekte symbolische Links zurück. Auf einigen Plattformen kann diese Funktion False zurückgeben, wenn keine Berechtigung zur Ausführung von os.stat() auf der angeforderten Datei besteht, selbst wenn der Pfad physisch existiert. Geändert in Version 3.3: path kann jetzt eine ganze Zahl sein: True wird zurückgegeben, wenn es sich um einen offenen Dateideskriptor handelt, andernfalls False. Geändert in Version 3.6: Akzeptiert ein pfadähnliches Objekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X