38 Frage: Wie überprüfe ich, ob eine Datei ohne Ausnahmen existiert?

Frage erstellt am Mon, Nov 5, 2018 12:00 AM

Wie kann ich feststellen, ob eine Datei vorhanden ist oder nicht, ohne die try Anweisung?

    
5065
  1. Warum möchten Sie die Ausnahmen in Python vermeiden? Sie sind die idiomatische Art, Dinge zu tun.
    2019-03-27 14: 39: 30Z
  2. Wenn in Abhängigkeit von der nicht vorhandenen Datei ein wichtiger Code vorhanden ist, wird dies durch die Aufnahme in die except:-Klausel zu einer Ausnahme, die in diesem Teil Ihres Codes auftritt wird eine verwirrende Meldung auslösen (zweiter Fehler während der Verarbeitung des ersten.)
    2019-05-24 10: 40: 02Z
30 Antworten                              30                         

Wenn der Grund dafür ist, dass Sie etwas wie if file_exists: open_it() tun können, ist es sicherer, eine try zu verwenden, wenn Sie versuchen, sie zu öffnen. Beim Überprüfen und anschließenden Öffnen besteht die Gefahr, dass die Datei gelöscht oder verschoben wird oder zwischen dem Zeitpunkt des Überprüfens und dem Zeitpunkt, zu dem Sie versuchen, sie zu öffnen.

Wenn Sie die Datei nicht sofort öffnen möchten, können Sie os.path.isfile

  

Geben Sie True zurück, wenn path eine vorhandene reguläre Datei ist. Dies folgt symbolischen Links, sodass sowohl islink () als auch isfile () kann für denselben Pfad gelten.

 
import os.path
os.path.isfile(fname) 

Wenn Sie sicher sein müssen, dass es sich um eine Datei handelt.

Beginnend mit Python 3.4 das pathlib-Modul bietet einen objektorientierten Ansatz (zurückportiert auf pathlib2 in Python 2.7):

 
from pathlib import Path

my_file = Path("/path/to/file")
if my_file.is_file():
    # file exists

Gehen Sie wie folgt vor, um ein Verzeichnis zu überprüfen:

 
if my_file.is_dir():
    # directory exists

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

 
if my_file.exists():
    # path exists

Sie können resolve(strict=True) auch in einem try-Block verwenden:

 
try:
    my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
    # doesn't exist
else:
    # exists
    
4642
13.05.2019 10: 40: 43Z
  1. bezüglich der ersten Bemerkung (verwenden Sie "try", wenn vor dem Öffnen geprüft wird), funktioniert dies leider nicht, wenn Sie zum Anhängen öffnen möchten, da sichergestellt ist, dass es vor dem 'a' existiert. Modus wird erstellt, wenn nicht vorhanden.
    2018-06-20 07: 58: 09Z
  2. Beachten Sie, dass FileNotFoundError in Python 3 eingeführt wurde. Wenn Sie neben Python 3 auch Python 2.7 unterstützen müssen, können Sie stattdessen IOError verwenden (welche FileNotFoundError-Unterklassen). stackoverflow.com/a/21368457/1960959
    2019-03-29 13: 44: 15Z
  3. @ makapuf Sie können es zum "Aktualisieren" öffnen (open('file', 'r+')) und dann bis zum Ende suchen.
    30.04.2019 17: 45: 44Z
  4. os.path.isfile (fname) ist alles, was ich brauche. Vielen Dank!
    30.05.2019 10: 30: 46Z

Sie haben die Funktion os.path.exists :

 
import os.path
os.path.exists(file_path)

Dies gibt True für Dateien und Verzeichnisse zurück, aber Sie können stattdessen

verwenden  
os.path.isfile(file_path)

um zu testen, ob es sich um eine bestimmte Datei handelt. Es folgen symbolische Links.

    
1936
2018-10-19 08: 58: 59Z

Im Gegensatz zu isfile() , exists() gibt True für Verzeichnisse zurück.
Je nachdem, ob Sie nur einfache Dateien oder auch Verzeichnisse möchten, verwenden Sie isfile() oder exists(). Hier ist eine einfache REPL-Ausgabe.

 
>>> print os.path.isfile("/etc/password.txt")
True
>>> print os.path.isfile("/etc")
False
>>> print os.path.isfile("/does/not/exist")
False
>>> print os.path.exists("/etc/password.txt")
True
>>> print os.path.exists("/etc")
True
>>> print os.path.exists("/does/not/exist")
False
    
893
2016-12-02 19: 33: 06Z
 
import os.path

if os.path.isfile(filepath):
    
553
2017-06-21 20: 33: 46Z

Verwenden Sie os.path.isfile() mit os.access() :

 
import os
import os.path

PATH='./file.txt'

if os.path.isfile(PATH) and os.access(PATH, os.R_OK):
    print "File exists and is readable"
else:
    print "Either the file is missing or not readable"
    
271
16.07.2018 10: 21: 08Z
  1. mit mehreren Bedingungen, von denen einige überflüssig sind, ist weniger klar und explizit.
    2013-04-09 05: 45: 27Z
  2. Es ist auch redundant. Wenn die Datei nicht existiert, gibt os.access() false zurück.
    2018-03-13 00: 01: 19Z
  3. @ EJP Unter Linux können Dateien existieren, sind aber nicht zugänglich.
    2018-07-16 21: 30: 18Z
  4. Da Sie import os verwenden, müssen Sie import os.path nicht erneut ausführen, da es bereits Teil von os ist. Sie müssen nur os.path importieren, wenn Sie nur Funktionen von os.path und nicht von os selbst verwenden möchten, um ein kleineres Objekt zu importieren. Da Sie jedoch os.access und os.R_OK verwenden, ist der zweite Import nicht erforderlich.
    2018-08-24 13: 10: 26Z
 
import os
os.path.exists(path) # Returns whether the path (directory or file) exists or not
os.path.isfile(path) # Returns whether the file exists or not
    
254
2018-06-02 20: 52: 01Z

Obwohl in (mindestens einer) der vorhandenen Antworten fast jeder mögliche Weg aufgelistet wurde (z. B. wurden Python 3.4 -spezifische Dinge hinzugefügt), werde ich versuchen, alles zusammenzufassen.

>

Hinweis : Jeder Teil des Python -Standardbibliothekscodes, den ich veröffentlichen werde, gehört zur Version 3.5.3 . p>

Problemstellung :

  1. Datei prüfen ( fraglich : auch Ordner ("spezielle" Datei)?)
  2. Verwenden Sie nicht versuchen / , außer / else / endlich blockiert

Mögliche Lösungen :

  1. [Python 3]: os.path exists ( path ) (überprüfen Sie auch andere Funktionsfamilienmitglieder wie os.path.isfile, os.path.isdir, os.path.lexists auf geringfügig abweichende Verhaltensweisen)

     
    os.path.exists(path)
    
      

    True zurückgeben, wenn Pfad auf einen vorhandenen Pfad oder einen geöffneten Dateideskriptor verweist. Gibt False für unterbrochene symbolische Links zurück. Auf einigen Plattformen gibt diese Funktion möglicherweise False zurück, wenn keine Berechtigung zum Ausführen von os erteilt wurde .stat () in der angeforderten Datei, auch wenn der Pfad physisch existiert.

    Alles in Ordnung, aber wenn Sie dem Importbaum folgen:

    • os.path - posixpath.py ( ntpath.py )

      • genericpath.py , Zeile ~ # 20 +

         
        def exists(path):
            """Test whether a path exists.  Returns False for broken symbolic links"""
            try:
                st = os.stat(path)
            except os.error:
                return False
            return True
        

    Es ist nur ein Versuch / , außer dass um [Python 3]: os. stat ( Pfad, *, dir_fd = Keine, follow_symlinks = Richtig ) . Ihr Code ist also try / , außer free, aber im unteren Frame-Stack gibt es (zumindest) ein solcher Block. Dies gilt auch für andere Funktionen ( einschließlich os.path.isfile).

    1.1. [Python 3]: Pfad. is_file ()

    • Es ist eine schickere (und python ) Art, mit Pfaden umzugehen, aber
    • Unter der Haube funktioniert genau dasselbe ( pathlib.py , Zeile ~ # 1330 ):

       
      def is_file(self):
          """
          Whether this path is a regular file (also True for symlinks pointing
          to regular files).
          """
          try:
              return S_ISREG(self.stat().st_mode)
          except OSError as e:
              if e.errno not in (ENOENT, ENOTDIR):
                  raise
              # Path doesn't exist or is a broken symlink
              # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
              return False
      
  2. [Python 3]: With Statement Context Managers . Entweder:

    • Erstellen Sie eines:

       
      class Swallow:  # Dummy example
          swallowed_exceptions = (FileNotFoundError,)
      
          def __enter__(self):
              print("Entering...")
      
          def __exit__(self, exc_type, exc_value, exc_traceback):
              print("Exiting:", exc_type, exc_value, exc_traceback)
              return exc_type in Swallow.swallowed_exceptions  # only swallow FileNotFoundError (not e.g. TypeError - if the user passes a wrong argument like None or float or ...)
      
      • Und seine Verwendung - Ich werde das os.path.isfile-Verhalten replizieren (beachten Sie, dass dies nur zu Demonstrationszwecken dient. Versuchen Sie nicht , einen solchen Code für die Produktion zu schreiben):  

        import os
        import stat
        
        
        def isfile_seaman(path):  # Dummy func
            result = False
            with Swallow():
                result = stat.S_ISREG(os.stat(path).st_mode)
            return result
        
    • Verwenden Sie [Python 3]: contextlib. ( * Ausnahmen ) unterdrücken - Dies wurde speziell zum selektiven Unterdrücken von Ausnahmen

    • entwickelt


    Aber es scheint, als würden sie versuchen / , außer / else / finally blockiert als [Python 3]: Die with -Anweisung lautet:

      

    Dies ermöglicht häufige Versuche ... except ... Endlich Verwendungsmuster, die zur bequemen Wiederverwendung eingekapselt werden sollen.

  3. Funktionen zum Durchsuchen des Dateisystems (und Durchsuchen der Ergebnisse nach übereinstimmenden Elementen)


    Da diese über Ordner iterieren, sind sie (in den meisten Fällen) für unser Problem ineffizient (es gibt Ausnahmen, wie beispielsweise nicht mit Platzhaltern versehenes Glob -Bing - wie @ShadowRanger hervorhob). Ich werde also nicht darauf bestehen. Ganz zu schweigen davon, dass in einigen Fällen die Verarbeitung von Dateinamen erforderlich sein kann.

  4. [Python 3]: os. access ( path, mode, *, dir_fd = None, effective_ids = False, follow_symlinks = True ) , dessen Verhalten in der Nähe von os.path.exists liegt (tatsächlich ist es breiter, hauptsächlich wegen der 2 nd argument)

    • Nutzerberechtigungen können die Sichtbarkeit der Datei einschränken, wie im Dokument angegeben:
        

      ... testen, ob der aufrufende Benutzer über den angegebenen Zugriff auf den Pfad verfügt. Der Modus sollte zum Testen F_OK sein die Existenz des Pfades ...

    os.access("/tmp", os.F_OK)

    Da ich auch in C arbeite, verwende ich diese Methode auch, da sie unter der Haube native API s aufruft (erneut, über "${PYTHON_SRC_DIR} /Modules/posixmodule.c" ), aber es öffnet auch ein Tor für mögliche Benutzerfehler und es ist nicht wie Python ic als andere Varianten. Verwenden Sie @AaronHall daher nur, wenn Sie wissen, was Sie tun:

    Hinweis : Das Aufrufen der nativen API ist auch über [Python 3]: ctypes - Eine fremde Funktionsbibliothek für Python , aber in den meisten Fällen ist es komplizierter.

    ( Win spezifisch): Seit vcruntime * ( msvcr * ) .dll exportiert eine [ MS.Docs]: _access, _waccess Funktionsfamilie, hier ein Beispiel:

     
    Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os, ctypes
    >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\cmd.exe", os.F_OK)
    0
    >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\cmd.exe.notexist", os.F_OK)
    -1
    

    Hinweise :

    • Es ist zwar keine gute Vorgehensweise, ich verwende os.F_OK im Anruf, aber dies dient nur der Klarheit (der Wert ist 0 )
    • Ich verwende _waccess , damit derselbe Code auf Python3 und Python2 funktioniert (trotz Unicode ) > verwandte Unterschiede zwischen ihnen)
    • Obwohl dies auf einen ganz bestimmten Bereich abzielt, wurde es in keiner der vorherigen Antworten erwähnt


    Das Gegenstück zu Lnx ( Ubtu (16 x 64) ):

     
    Python 3.5.2 (default, Nov 17 2016, 17:05:23)
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os, ctypes
    >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp", os.F_OK)
    0
    >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp.notexist", os.F_OK)
    -1
    

    Hinweise :

    • Stattdessen wird der Pfad von libc ( "/lib /x86_64-linux-gnu /libc.so.6" ), der möglicherweise (und höchstwahrscheinlich) Je nach System kann None (oder die leere Zeichenfolge) an den CDLL -Konstruktor ( ctypes.CDLL(None).access(b"/tmp", os.F_OK) ) übergeben werden. Laut [man7]: DLOPEN (3) :

        

      Wenn Dateiname NULL ist, gilt das zurückgegebene Handle für das Hauptelement   Programm. Wenn dieses Handle an dlsym () übergeben wird, wird nach a gesucht   Symbol im Hauptprogramm, gefolgt von allen gemeinsam genutzten Objekten, die bei geladen wurden   Programm startup und dann alle gemeinsam genutzten Objekte, die von dlopen () mit geladen wurden   das Flag RTLD_GLOBAL .

      • Das (aktuelle) Hauptprogramm ( Python ) ist mit libc verknüpft, sodass dessen Symbole (einschließlich Zugriff ) geladen werden
      • Dies muss mit Vorsicht behandelt werden, da Funktionen wie main , Py_Main und (alle) andere verfügbar sind. Das Aufrufen könnte katastrophale Auswirkungen haben (auf das aktuelle Programm).
      • Dies gilt nicht auch für Win (aber das ist keine so große Sache, da sich msvcrt.dll in "% SystemRoot% \System32 befindet ", der sich standardmäßig in % PATH% befindet). Ich wollte die Dinge weiterentwickeln und dieses Verhalten auf Win replizieren (und einen Patch einreichen), aber wie sich herausstellt, [MS.Docs]: GetProcAddress-Funktion " sieht "nur exportierte Symbole, es sei denn, jemand deklariert die Funktionen in der ausführbaren Hauptdatei als __declspec(dllexport) (warum in aller Welt würde die normale Person das tun?), das Hauptprogramm ist ladbar, aber ziemlich unbrauchbar
  5. Installieren Sie Module von Drittanbietern mit Dateisystemfunktionen.

    Wird sich höchstwahrscheinlich auf einen der oben genannten Wege stützen (möglicherweise mit geringfügigen Anpassungen).
    Ein Beispiel wäre (wieder Win spezifisch) [GitHub]: mhammond /pywin32 - Python für Windows (pywin32) -Erweiterungen , bei denen es sich um einen Python-Wrapper über WINAPI handelt.

    Aber da dies eher eine Problemumgehung ist, höre ich hier auf.

  6. Eine andere (lahme) Problemumgehung ( gainarie ) ist (wie ich es gerne nenne) der sysadmin -Ansatz: Verwenden Sie Python als Wrapper zum Ausführen von Shell-Befehlen

    • Win :

       
      (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe\" > nul 2>&1'))"
      0
      
      (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe.notexist\" > nul 2>&1'))"
      1
      
    • Nix ( Lnx ( Ubtu )):

       
      [cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp\" > /dev/null 2>&1'))"
      0
      [cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp.notexist\" > /dev/null 2>&1'))"
      512
      

Fazit:

  • Verwenden Sie und versuchen Sie es / , außer / ansonsten / endlich blockiert, weil sie verhindern können, dass Sie auf eine Reihe von bösen Problemen stoßen. Ein Gegenbeispiel, das ich mir vorstellen kann, ist die Leistung: Solche Blöcke sind kostspielig. Versuchen Sie daher, sie nicht in Code zu platzieren, der Hunderttausende Male pro Sekunde ausgeführt werden soll. es wird nicht der Fall sein).

Letzte Anmerkung (en) :

  • Ich werde versuchen, es auf dem neuesten Stand zu halten. Vorschläge sind willkommen. Ich werde alles Nützliche in die Antwort einbeziehen.
216
2019-02-08 09: 36: 33Z
  1. Können Sie auf diese Aussage näher eingehen? "Es ist zwar keine gute Vorgehensweise, ich verwende os.F_OK im Aufruf, aber dies dient nur der Klarheit (der Wert ist 0)"
    2017-11-19 01: 46: 40Z
  2. @ sk8asd123: Es ist ziemlich schwierig, dies in einem Kommentar zu tun: Im Allgemeinen ist es am besten, Konstanten mit Funktionen zu verwenden, mit denen sie zusammenkommen. Dies gilt für die Arbeit mit mehreren Modulen, die dieselbe Konstante definieren, da einige möglicherweise nicht auf dem neuesten Stand sind und die Funktionen und Konstanten am besten synchronisiert sind. Bei der Arbeit mit ctypes (direkter Aufruf der Funktionen) hätte ich die Konstante (von MSDN ) definieren oder gar keine Konstante verwenden sollen. Es ist nur eine Richtlinie, die ich verwende, in 99,9% macht es wahrscheinlich keinen Unterschied (funktional).
    2017-11-19 23: 54: 34Z
  3. @ CristiFati: Ab 3.6 glob.iglob (und auch glob.glob) basieren auf os.scandir , daher ist es jetzt faul; Um den ersten Treffer in einem Verzeichnis mit 10 Millionen Dateien zu erhalten, scannen Sie nur, bis Sie den ersten Treffer erreichen. Und selbst vor 3.6, wenn Sie glob-Methoden ohne Platzhalter verwenden, ist die Funktion klug: Es weiß, dass Sie nur einen Treffer haben können, also vereinfacht das Verschieben auf nur os.path.isdir oder os.path.lexists (abhängig davon, ob der Pfad in / endet).
    2017-11-29 18: 29: 02Z
  4. Dieser zweite Teil meines Kommentars (nicht mit Platzhaltern versehenes Globbing iteriert den Ordner nicht und hat es auch nie getan) bedeutet, dass er eine perfekt effiziente Lösung für das Problem darstellt (langsamer) als direkt os.path.isdir oder os.path.lexist aufzurufen, da es sich um eine Reihe von Funktionsaufrufen und Zeichenfolgenoperationen auf Python-Ebene handelt, bevor entschieden wird, dass der effiziente Pfad realisierbar ist, aber keine zusätzlichen Systemaufrufe oder E /A-Vorgänge, die um Größenordnungen langsamer sind.
    2017-11-29 18: 38: 49Z

Dies ist die einfachste Methode, um zu überprüfen, ob eine Datei vorhanden ist. Nur weil die Datei beim Aktivieren vorhanden war, kann nicht garantiert werden, dass sie beim Öffnen vorhanden ist.

 
import os
fname = "foo.txt"
if os.path.isfile(fname):
    print("file does exist at this time")
else:
    print("no such file exists at this time")
    
146
14.01.2018 04: 07: 53Z
  1. Solange Sie auf die Datei zugreifen möchten, besteht die Race-Bedingung , unabhängig davon, wie Ihr Programm aufgebaut ist. Ihr Programm kann nicht garantieren, dass ein anderer Prozess auf dem Computer die Datei nicht geändert hat. Eric Lippert spricht von einer exogenen Ausnahme . Sie können dies nicht vermeiden, indem Sie vorher prüfen, ob die Datei vorhanden ist.
    2014-11-23 18: 37: 59Z
  2. @ IsaacSupeene Es wird empfohlen, das Fenster der (Datei-) Operation so klein wie möglich zu halten, gefolgt von einer ordnungsgemäßen Ausnahmebehandlung
    2018-07-28 02: 52: 48Z

Python 3.4 + verfügt über ein objektorientiertes Pfadmodul: pathlib Mit diesem neuen Modul können Sie prüfen, ob eine Datei wie folgt vorhanden ist:

 
import pathlib
p = pathlib.Path('path/to/file')
if p.is_file():  # or p.is_dir() to see if it is a directory
    # do stuff

Sie können (und sollten) beim Öffnen von Dateien weiterhin einen try/except-Block verwenden:

 
try:
    with p.open() as f:
        # do awesome stuff
except OSError:
    print('Well darn.')

Das pathlib-Modul enthält viele nützliche Funktionen: bequemes Verschieben, Überprüfen des Dateieigentümers, einfacheres Zusammenfügen von Pfaden usw. Es lohnt sich, dies zu überprüfen. Wenn Sie auf einem älteren Python (Version 2.6 oder höher) arbeiten, können Sie Pathlib weiterhin mit pip:

installieren  
# installs pathlib2 on older Python versions
# the original third-party module, pathlib, is no longer maintained.
pip install pathlib2

Importieren Sie es dann wie folgt:

 
# Older Python versions
import pathlib2 as pathlib
    
133
2017-12-04 14: 45: 12Z

Bevorzugen Sie die try-Anweisung. Es gilt als besserer Stil und vermeidet Rennbedingungen.

Nimm mein Wort nicht dafür. Es gibt viel Unterstützung für diese Theorie. Hier ist ein paar:

117
2014-04-28 01: 01: 59Z
  1. Bitte fügen Sie bessere Quellen hinzu, um Ihre Aussage zu unterstützen.
    10.09.2015 09: 09: 37Z
  2. Der angegebene Link "Vermeiden von Rennbedingungen" (Apple Dev Support) unterstützt Ihre Antwort nicht. Es geht nur darum, temporäre Dateien zu verwenden, die vertrauliche Informationen auf schlecht gestalteten Betriebssystemen enthalten, die temporäre Dateien /Verzeichnisse über eingeschränkte Berechtigungen nicht ordnungsgemäß in einer Sandbox speichern. Die Verwendung von try...except hilft nicht, dieses Problem zu lösen.
    28.09.2015 15: 38: 00Z
  3. @ chrisz Ich glaube nicht, dass es sich nur um einen Link handelt - es enthält tatsächlich andere Informationen als den Link.
    2018-02-19 04: 30: 09Z
  4. Das Problem bei dieser Methode ist, dass, wenn Sie einen wichtigen Code haben, der von der nicht vorhandenen Datei abhängt, das Einfügen in die except:-Klausel dazu führt, dass eine Ausnahme auftritt In diesem Teil Ihres Codes wird eine verwirrende Meldung ausgegeben (zweiter Fehler bei der Verarbeitung des ersten.)
    2019-05-24 10: 43: 34Z
  

Wie überprüfe ich mit Python, ob eine Datei vorhanden ist, ohne eine try-Anweisung zu verwenden?

Jetzt verfügbar seit Python 3.4, importieren und instanziieren Sie ein Path-Objekt mit dem Dateinamen und überprüfen Sie die is_file-Methode (beachten Sie, dass dies True für Symlinks zurückgibt, die auch auf reguläre Dateien verweisen):

 
>>> from pathlib import Path
>>> Path('/').is_file()
False
>>> Path('/initrd.img').is_file()
True
>>> Path('/doesnotexist').is_file()
False

Wenn Sie mit Python 2 arbeiten, können Sie das Pathlib-Modul von pypi pathlib2 aus zurückportieren > oder überprüfen Sie auf andere Weise isfile über das os.path-Modul:

 
>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False

Nun, das Obige ist wahrscheinlich die beste pragmatische direkte Antwort, aber es gibt die Möglichkeit einer Race-Bedingung (abhängig davon, was Sie erreichen möchten) und die Tatsache, dass die zugrunde liegende Implementierung eine try verwendet, Python jedoch try überall in seiner Umsetzung.

Da Python überall try verwendet, gibt es wirklich keinen Grund, eine Implementierung zu vermeiden, die es verwendet.

Der Rest dieser Antwort versucht jedoch, diese Vorbehalte zu berücksichtigen.

Längere, umständlichere Antwort

Verwenden Sie das neue Path-Objekt in pathlib, das seit Python 3.4 verfügbar ist. Beachten Sie, dass .exists nicht ganz richtig ist, da Verzeichnisse keine Dateien sind (außer im Unix-Sinne, dass alles eine Datei ist).

 
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True

Wir müssen also is_file verwenden:

 
>>> root.is_file()
False

Hier ist die Hilfe zu is_file:

 
is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).

Lassen Sie uns eine Datei erhalten, von der wir wissen, dass sie eine Datei ist:

 
>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True

Standardmäßig löscht NamedTemporaryFile die Datei beim Schließen (und wird automatisch geschlossen, wenn keine weiteren Verweise darauf vorhanden sind).

 
>>> del file
>>> filepathobj.exists()
False
>>> filepathobj.is_file()
False

Wenn Sie sich jedoch mit der Implementierung befassen Sie werden sehen, dass is_file try verwendet:

 
def is_file(self):
    """
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).
    """
    try:
        return S_ISREG(self.stat().st_mode)
    except OSError as e:
        if e.errno not in (ENOENT, ENOTDIR):
            raise
        # Path doesn't exist or is a broken symlink
        # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
        return False

Race Conditions: Warum wir es gerne versuchen

Wir mögen try, weil es Rennbedingungen vermeidet. Mit try versuchen Sie einfach, Ihre Datei zu lesen, und erwarten, dass sie dort ist. Andernfalls können Sie die Ausnahme abfangen und das sinnvolle Fallback-Verhalten ausführen.

Wenn Sie überprüfen möchten, ob eine Datei vorhanden ist, bevor Sie versuchen, sie zu lesen, und wenn Sie sie möglicherweise löschen und dann möglicherweise mehrere Threads oder Prozesse verwenden, oder wenn ein anderes Programm diese Datei kennt und sie löschen könnte, besteht Ihr Risiko Wenn Sie überprüfen, ob ein Race-Zustand vorliegt, besteht die Möglichkeit, dass Sie rennen , um ihn zu öffnen, bevor sich sein Zustand (seine Existenz) ändert.

Race-Bedingungen sind sehr schwer zu debuggen, da es ein sehr kleines Fenster gibt, in dem Ihr Programm fehlschlagen kann.

Wenn dies Ihre Motivation ist, können Sie mithilfe des try-Kontextmanagers den Wert einer suppress-Anweisung abrufen .

Vermeiden von Rennbedingungen ohne eine Versuchsanweisung: suppress

In Python 3.4 haben wir den suppress -Kontextmanager (zuvor den ignore Kontextmanager), der in weniger Zeilen semantisch genau dasselbe macht, aber auch (zumindest oberflächlich) ) Treffen Sie die ursprüngliche Bitte, eine try-Aussage zu vermeiden:

 
from contextlib import suppress
from pathlib import Path

Verwendung:

 
>>> with suppress(OSError), Path('doesnotexist').open() as f:
...     for line in f:
...         print(line)
... 
>>>
>>> with suppress(OSError):
...     Path('doesnotexist').unlink()
... 
>>> 

Für frühere Pythons könnten Sie Ihre eigene suppress rollen, aber ohne eine try sind Sie wortreicher als mit. Ich glaube, dies ist tatsächlich die einzige Antwort, die try auf keiner Ebene in Python verwendet , die vor Python 3.4 angewendet werden kann, da stattdessen ein Kontext-Manager verwendet wird:

 
class suppress(object):
    def __init__(self, *exceptions):
        self.exceptions = exceptions
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type is not None:
            return issubclass(exc_type, self.exceptions)

Vielleicht einfacher mit einem Versuch:

 
from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass

Andere Optionen, die die Aufforderung "ohne Versuch" nicht erfüllen:

isfile

 
import os
os.path.isfile(path)

aus den Dokumenten :

  

os.path.isfile(path)

     

Gibt True zurück, wenn path eine vorhandene reguläre Datei ist.Dies folgt symbolisch   Links, sodass sowohl islink() als auch isfile() für denselben Pfad zutreffen können.

Betrachten Sie jedoch die Quelle Sie werden sehen, dass tatsächlich eine try-Anweisung verwendet wird:

 
# This follows symbolic links, so both islink() and isdir() can be true
# for the same path on systems that support symlinks
def isfile(path):
    """Test whether a path is a regular file"""
    try:
        st = os.stat(path)
    except os.error:
        return False
    return stat.S_ISREG(st.st_mode)
 
>>> OSError is os.error
True

Alles, was es tut, ist, den angegebenen Pfad zu verwenden, um zu prüfen, ob Statistiken abgerufen werden können, OSError abzufangen und dann zu prüfen, ob es sich um eine Datei handelt, wenn die Ausnahme nicht ausgelöst wurde.

Wenn Sie beabsichtigen, etwas mit der Datei zu tun, würde ich vorschlagen, sie direkt mit einem try-except zu versuchen, um eine Racebedingung zu vermeiden:

 
try:
    with open(path) as f:
        f.read()
except OSError:
    pass

os.access

Verfügbar für Unix und Windows ist os.access, zur Verwendung müssen Sie jedoch Flags übergeben, und es wird nicht zwischen Dateien und Verzeichnissen unterschieden. Dies wird eher verwendet, um zu testen, ob der tatsächlich aufrufende Benutzer in einer Umgebung mit erhöhten Rechten Zugriff hat:

 
import os
os.access(path, os.F_OK)

Es hat auch die gleichen Probleme mit den Rennbedingungen wie isfile. In den Dokumenten :

  

Hinweis:   Verwenden von access (), um zu überprüfen, ob ein Benutzer berechtigt ist, z. öffne einen Ordner   davor erzeugt open () eine Sicherheitslücke, weil   Der Benutzer kann das kurze Zeitintervall zwischen Überprüfung und ausnutzen   Öffnen Sie die Datei, um sie zu bearbeiten. Es ist vorzuziehen, EAFP zu verwenden   Techniken. Zum Beispiel:

 
if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()
return "some default data"
     

ist besser geschrieben als:

 
try:
    fp = open("myfile")
except IOError as e:
    if e.errno == errno.EACCES:
        return "some default data"
    # Not a permission error.
    raise
else:
    with fp:
        return fp.read()

Vermeiden Sie die Verwendung von os.access. Dies ist eine Funktion auf niedriger Ebene, die mehr Möglichkeiten für Benutzerfehler bietet als die oben diskutierten Objekte und Funktionen auf höherer Ebene.

Kritik an einer anderen Antwort:

Eine andere Antwort sagt dies über os.access:

  

Persönlich bevorzuge ich diese, weil sie unter der Haube native APIs aufruft (über "${PYTHON_SRC_DIR} /Modules/posixmodule.c"), aber auch ein Tor für mögliche Benutzerfehler öffnet und nicht so pythonisch ist als andere Varianten:

Diese Antwort besagt, dass eine nicht-pythonische, fehleranfällige Methode ohne Begründung bevorzugt wird. Es scheint Benutzer zu ermutigen, APIs auf niedriger Ebene zu verwenden, ohne sie zu verstehen.

Es wird auch ein Kontext-Manager erstellt, der durch die bedingungslose Rückgabe von True alle Ausnahmen (einschließlich KeyboardInterrupt und SystemExit!) unbemerkt weitergibt. Dies ist eine gute Möglichkeit, Fehler zu verbergen.

Dies scheint die Nutzer zu ermutigen, schlechte Praktiken anzuwenden.

    
110
25.02.2018 20: 45: 39Z
 
import os
#Your path here e.g. "C:\Program Files\text.txt"
#For access purposes: "C:\\Program Files\\text.txt"
if os.path.exists("C:\..."):   
    print "File found!"
else:
    print "File not found!"

Durch den Import von os können Sie mit Ihrem Betriebssystem einfacher navigieren und Standardaktionen ausführen.

Zum Nachschlagen siehe auch So überprüfen Sie, ob eine Datei mit Python vorhanden ist

Wenn Sie Operationen auf hoher Ebene benötigen, verwenden Sie shutil.

    
82
2017-05-16 16: 36: 46Z
  1. Diese Antwort ist falsch. os.path.exists gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies führt zu Fehlalarmen. Lesen Sie die anderen Antworten, die os.path.isfile empfehlen.
    2015-08-01 13: 56: 22Z

Testen auf Dateien und Ordner mit os.path.isfile(), os.path.isdir() und os.path.exists()

Unter der Annahme, dass der "Pfad" ein gültiger Pfad ist, zeigt diese Tabelle, was von jeder Funktion für Dateien und Ordner zurückgegeben wird:

eingeben Bildbeschreibung hier

Sie können auch mit os.path.splitext() testen, ob eine Datei ein bestimmter Dateityp ist, um die Erweiterung zu erhalten (sofern Sie sie nicht bereits kennen).

 
>>> import os
>>> path = "path to a word document"
>>> os.path.isfile(path)
True
>>> os.path.splitext(path)[1] == ".docx" # test if the extension is .docx
True
    
76
2016-10-08 12: 43: 02Z

Im Jahr 2016 verwendet der beste Weg immer noch os.path.isfile:

 
>>> os.path.isfile('/path/to/some/file.txt')

Oder in Python 3 können Sie pathlib verwenden:

 
import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
    ...
    
67
2017-05-27 01: 00: 22Z
  1. Darf ich fragen: Was ist der Vorteil der Verwendung des Moduls 'pathlib' anstelle des Moduls 'os' in python3 für diese Prüfung?
    2016-02-25 08: 55: 33Z
  2. pathlib ist die OOP-Lösung von Python für Pfade. Sie können viel mehr damit machen. Wenn Sie nur die Existenz überprüfen müssen, ist der Vorteil nicht so groß.
    2016-02-25 10: 44: 49Z

Es scheint keinen bedeutenden funktionalen Unterschied zwischen try /except und isfile() zu geben, daher sollten Sie verwenden, welches sinnvoll ist.

Wenn Sie eine Datei lesen möchten, falls vorhanden, führen Sie

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

Wenn Sie eine Datei jedoch nur umbenennen möchten, wenn sie vorhanden ist, und sie daher nicht öffnen müssen, führen Sie

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

Wenn Sie in eine Datei schreiben möchten, führen Sie

aus, wenn sie nicht vorhanden ist  
# 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 Dateisperrung benötigen, ist das eine andere Sache.

    
62
25.08.2015 03: 12: 24Z
  1. Diese Antwort ist falsch. os.path.exists gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies führt zu Fehlalarmen. Lesen Sie die anderen Antworten, die os.path.isfile empfehlen.
    2015-08-01 13: 54: 35Z
  2. In Ihrem dritten Beispiel erstelle ich einen Link mit dem Namen filepath mit dem richtigen Timing, und BAM überschreiben Sie die Zieldatei. Sie sollten open(filepath, 'wx') in einem try...except-Block ausführen, um das Problem zu vermeiden.
    24.08.2015 14: 05: 09Z
  3. In Ihrem zweiten Beispiel erhalten Sie zumindest unter Windows einen OSError, wenn dieser bereits vorhanden ist: "Wenn dst bereits vorhanden ist, wird OSError unter Windows ausgelöst, auch wenn Es ist eine Datei. Möglicherweise gibt es keine Möglichkeit, eine atomare Umbenennung zu implementieren, wenn dst eine vorhandene Datei benennt. "
    2016-05-24 14: 14: 04Z
  4. @ TomMyddeltyn: Ab Python 3.3 führt filepath + '.old' portabel ein unbeaufsichtigtes Ersetzen der Zieldatei durch (es ist identisch mit dem Linux-Verhalten von os.replace) (es tritt nur dann ein Fehler auf, wenn der Zielname existiert und ein Verzeichnis ist). Sie bleiben also bei 2.x, aber Py3-Benutzer haben seit mehreren Jahren eine gute Option.
    2017-11-29 18: 14: 56Z
  5. Zum Beispiel os.rename: Es sollte immer noch mit rename/try gemacht werden. except (oder os.rename in modernem Python) ist atomar; Wenn Sie das Kontrollkästchen aktivieren und dann umbenennen, werden unnötige Rennen und zusätzliche Systemaufrufe ausgelöst. Mach einfach os.replace
    2017-11-29 18: 17: 31Z

Sie können dies versuchen (sicherer):

 try: os.replace(filepath, filepath + '.old') except OSError: pass

Die Ausgabe wäre:

  

([Errno 2] Keine solche Datei oder kein solches Verzeichnis:   'whatever.txt')

Abhängig vom Ergebnis kann Ihr Programm dann von dort aus weiterlaufen oder Sie können programmieren, um es zu stoppen, wenn Sie möchten.

    
53
2017-05-27 00: 43: 51Z
  1. Die ursprüngliche Frage wurde nach einer Lösung gestellt, die
    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))
    
    nicht verwendet.
    2014-04-23 13: 10: 01Z
  2. Diese Antwort geht am OP vorbei. Das Überprüfen, ob eine Datei vorhanden ist, ist nicht dasselbe wie das Überprüfen, ob Sie sie öffnen können. Es gibt Fälle, in denen eine Datei vorhanden ist, Sie sie jedoch aus verschiedenen Gründen nicht öffnen können.
    2016-02-17 18: 52: 12Z

Obwohl ich immer die Verwendung von try- und try-Anweisungen empfehle, gibt es hier einige Möglichkeiten für Sie (mein persönlicher Favorit ist except):

  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 folgt erstellen:

     os.access

    Wenn es falsch ist, wird die Ausführung mit einem nicht behandelten IOError abgebrochen oder OSError in späteren Versionen von Python. Um die Ausnahme zu fangen, Sie müssen eine try except-Klausel verwenden. Natürlich kannst du das immer Verwenden Sie eine

    def File_Existence(filepath):
        f = open(filepath)
        return True
    
    except-Anweisung wie folgt (dank hsandt ) zum Nachdenken):  try
  2. Verwenden Sie

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

    Hiermit wird überprüft, ob das von Ihnen angegebene Objekt vorhanden ist. Es prüft jedoch, ob Dateien in den Verzeichnissen und vorhanden sind. Achten Sie daher darauf, wie Sie sie verwenden.

     os.path.exists(path)
  3. Verwenden Sie

    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
    
    :

    Hiermit wird geprüft, ob Sie Zugriff auf die Datei haben. Es wird nach Berechtigungen gesucht. Basierend auf der os.py-Dokumentation wird bei Eingabe von os.access(path, mode) die Existenz des Pfads überprüft. Dies führt jedoch zu einer Sicherheitslücke, da jemand Ihre Datei in der Zeit zwischen dem Überprüfen der Berechtigungen und dem Öffnen der Datei angreifen kann. Sie sollten stattdessen direkt zum Öffnen der Datei gehen, anstatt ihre Berechtigungen zu überprüfen. ( EAFP vs LBYP ). Wenn Sie die Datei anschließend nicht öffnen und nur ihre Existenz überprüfen möchten, können Sie dies verwenden.

    Wie auch immer, hier:

     os.F_OK

Ich sollte auch erwähnen, dass es zwei Möglichkeiten gibt, die Existenz einer Datei nicht zu überprüfen. Entweder ist das Problem

>>> import os
>>> os.access("/is/a/file.txt", os.F_OK)
True
oder permission denied. Wenn Sie einen no such file or directory fangen, setzen Sie den IOError (wie meine erste Option) und geben Sie dann IOError as e ein, damit Sie hoffentlich Ihr Problem bestimmen können. Ich hoffe, es hilft! :)     
48
2017-05-27 00: 52: 18Z

Datum: 2017-12-04

Jede mögliche Lösung wurde in anderen Antworten aufgeführt.

Mit den folgenden Methoden können Sie intuitiv und mit Argumenten prüfen, ob eine Datei vorhanden ist:

 print(e.args)

Ich habe ein ausführliches Spickzettel für Ihre Referenz erstellt:

 
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')
    
42
23.12.2018 10: 46: 13Z

Zusätzlich

#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']}
:  os.access()

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()
, R_OK und W_OK sind die zu testenden Flags für Berechtigungen ( doc ).     
33
2016-05-04 15: 24: 02Z

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

 X_OK

UPDATE

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

    
30
2018-07-22 19: 12: 53Z
  1. Diese Antwort ist falsch.
    >>> 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!')
    
    gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies führt zu Fehlalarmen. Lesen Sie die anderen Antworten, die os.path.exists empfehlen.
    2015-08-01 13: 55: 01Z
  2. hat auch das falsch-positive Problem bekommen.
    2018-05-19 21: 33: 55Z
  3. docs.python.org/3/library/os.path.html#os.path.exists Zum above Aussage von chris > os.path.exists (path) > Gibt True zurück, wenn der Pfad auf einen vorhandenen Pfad oder einen geöffneten Dateideskriptor verweist. Gibt False für unterbrochene symbolische Links zurück. Auf einigen Plattformen kann diese Funktion False zurückgeben, wenn keine Berechtigung zum Ausführen von os.stat () für die angeforderte Datei erteilt wurde, selbst wenn der Pfad physisch vorhanden ist. In Version 3.3 geändert: Pfad kann jetzt eine Ganzzahl sein: True wird zurückgegeben, wenn es ein offener Dateideskriptor ist, andernfalls False. In Version 3.6 geändert: Akzeptiert ein pfadähnliches Objekt.
    2018-08-31 23: 24: 22Z
 os.path.isfile
  

Das Auslösen von Ausnahmen wird als akzeptabel angesehen, und Pythonic   Ansatz für die Flusskontrolle in Ihrem Programm. Betrachten Sie die Handhabung als fehlend   Dateien mit IOErrors. In dieser Situation wird eine IOError-Ausnahme sein   Wird ausgelöst, wenn die Datei vorhanden ist, der Benutzer jedoch keine Leseberechtigung hat.

SRC: http://www.pfinn.net/python-check-if-file -exists.html

    
20
2015-07-18 17: 41: 08Z
  1. Das OP hat gefragt, wie geprüft werden soll, ob eine Datei vorhanden ist. Möglicherweise ist eine Datei vorhanden, Sie können sie jedoch nicht öffnen. Daher ist das Öffnen einer Datei als Proxy für die Überprüfung, ob die Datei vorhanden ist, nicht korrekt: Es werden falsche Negative angezeigt.
    2016-02-17 18: 58: 54Z

Wenn Sie NumPy bereits für andere Zwecke importiert haben, müssen keine weiteren Bibliotheken wie

if os.path.isfile(path_to_file):
    try: 
        open(path_to_file)
            pass
    except IOError as e:
        print "Unable to open file"
, pathlib, os usw. importiert werden.  paths

Dies gibt je nach Existenz "true" oder "false" zurück.

    
18
2018-09-01 01: 00: 51Z

Sie können Brians Vorschlag auch ohne die

import numpy as np
np.DataSource().exists("path/to/your/file")
schreiben.  try:

from contextlib import suppress

with suppress(IOError), open('filename'):
    process()
ist Teil von Python 3.4. In älteren Releases können Sie schnell Ihr eigenes Suppress schreiben:  suppress     
17
2017-05-27 00: 48: 31Z

Überprüfen Sie, ob eine Datei oder ein Verzeichnis vorhanden ist

Sie haben drei Möglichkeiten:

  

Hinweis 1: Der

from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass
wird nur für Dateien verwendet.
 os.path.isfile
  

Hinweis 2: Der

import os.path
os.path.isfile(filename) # True if file exists
os.path.isfile(dirname) # False if directory exists
wird sowohl für Dateien als auch für Verzeichnisse verwendet.
 os.path.exists
  

Die

import os.path
os.path.exists(filename) # True if file exists
os.path.exists(dirname) #True if directory exists
-Methode (enthalten in Python 3+, installierbar mit pip für Python 2)
 pathlib.Path     
16
2018-03-04 06: 24: 37Z

Hinzufügen einer weiteren geringfügigen Variation, die sich nicht genau in den anderen Antworten widerspiegelt.

Dies behandelt den Fall, dass der

from pathlib import Path
Path(filename).exists()
ein file_path oder ein leerer String ist.

 None

Hinzufügen einer Variante basierend auf einem Vorschlag von Shahbaz

 
def file_exists(file_path):
    if not file_path:
        return False
    elif not os.path.isfile(file_path):
        return False
    else:
        return True

Hinzufügen einer Variante auf Vorschlag von Peter Wood

 
def file_exists(file_path):
    if not file_path:
        return False
    else:
        return os.path.isfile(file_path)
    
15
2017-04-07 16: 10: 59Z
  1. def file_exists(file_path):
        return file_path and os.path.isfile(file_path):
    
    ist wirklich nur if (x) return true; else return false;. Ihre letzten vier Zeilen können return x werden. Während wir gerade dabei sind, kann die gesamte Funktion als return os.path.isfile(file_path) vereinfacht werden.
    2017-01-04 22: 50: 16Z
  2. Bei return file_path and os.path.isfile(file_path) müssen Sie vorsichtig sein. Python betrachtet eine leere Zeichenfolge als falsch iIn diesem Fall würden wir einen leeren String anstelle eines Bools zurückgeben. Der Zweck dieser Funktion ist es, immer bool zurückzugeben.
    2017-01-05 17: 08: 43Z
  3. Wahr. In diesem Fall ist return x jedoch if (x), es ist also bereits bool.
    2017-01-05 17: 10: 24Z
  4. x löst eine Ausnahme aus, weshalb ich die if-Prüfung hinzugefügt habe. Ich könnte es wahrscheinlich einfach in einen Versuch /einwickeln, aber ich hatte das Gefühl, dass es auf diese Weise expliziter ist.
    2017-01-05 17: 13: 10Z
  5. os.path.isfile(..)
    2017-04-06 10: 35: 01Z

Ich bin der Autor eines Pakets, das es seit ungefähr 10 Jahren gibt, und es hat eine Funktion, die diese Frage direkt anspricht. Grundsätzlich verwendet es os.path.isfile(None), um auf return file_path and os.path.isfile(file_path) zuzugreifen, wenn Sie sich auf einem Nicht-Windows-System befinden. Wenn Sie jedoch unter Windows arbeiten, wird Popen mit einem effizienten Dateisystem-Walker repliziert.

Der Code selbst verwendet keinen find-Block ... außer zur Bestimmung des Betriebssystems und damit zur Steuerung des "Unix" -Stils find oder des handgefertigten try. Timing-Tests ergaben, dass der find das Betriebssystem schneller ermitteln konnte, daher habe ich dort einen verwendet (aber nirgendwo anders).

 find

Und das Dokument ...

 try

Die Implementierung finden Sie hier: https://github.com/uqfoundation/pox2foundation /pox/shutils.py#L190

    
15
2017-05-27 00: 59: 52Z

Hier ist ein einzeiliger Python-Befehl für die Linux-Befehlszeilenumgebung. Ich finde das SEHR HANDY, da ich kein so heißer Bash-Typ bin.

 
>>> import pox
>>> pox.find('*python*', type='file', root=pox.homedir(), recurse=False)
['/Users/mmckerns/.python']

Ich hoffe, das ist hilfreich.

    
14
29.08.2015 16: 15: 29Z
  1. Einzeilige Prüfung in Bash:
    >>> print pox.find.__doc__
    find(patterns[,root,recurse,type]); Get path to a file or directory
    
        patterns: name or partial name string of items to search for
        root: path string of top-level directory to search
        recurse: if True, recurse down from root directory
        type: item filter; one of {None, file, dir, link, socket, block, char}
        verbose: if True, be a little verbose about the search
    
        On some OS, recursion can be specified by recursion depth (an integer).
        patterns can be specified with basic pattern matching. Additionally,
        multiple patterns can be specified by splitting patterns with a ';'
        For example:
            >>> find('pox*', root='..')
            ['/Users/foo/pox/pox', '/Users/foo/pox/scripts/pox_launcher.py']
    
            >>> find('*shutils*;*init*')
            ['/Users/foo/pox/pox/shutils.py', '/Users/foo/pox/pox/__init__.py']
    
    >>>
    
    (entspricht
    python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"
    
    ).
    2015-10-01 07: 48: 29Z

Sie können die "OS" -Bibliothek von Python verwenden:

 [ -f "${file}" ] && echo "file found" || echo "file not found"     
11
2017-05-27 00: 49: 25Z
  1. Diese Antwort ist falsch. if [ ... ]; then ...; else ...; fi gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies führt zu Fehlalarmen. Lesen Sie die anderen Antworten, die
    >>> import os
    >>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") 
    True
    >>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
    False
    
    empfehlen.
    2015-08-01 13: 55: 13Z
  2. @ Chris Johnson, Die Funktion os.path.exists () prüft, ob ein Pfad im System vorhanden ist. PATH kann ein DIRECTORY oder eine FILE sein. In beiden Fällen funktioniert es einwandfrei. Bitte versuchen Sie es mit einem Beispiel
    2015-08-02 14: 51: 41Z
  3. Diese Antwort funktioniert also. Großartig. Iff der Pfad ist nicht der einer Datei. Ging es darum? Nein.
    2016-04-14 23: 33: 56Z
  4. Das hängt davon ab. Wenn das Ziel der Ermittlung des Vorhandenseins einer "Datei" darin besteht, herauszufinden, ob der Pfad bereits vorhanden ist (und daher kein Pfad ist, in dem neue Daten gespeichert werden können, ohne andere Informationen zu löschen), ist os.path.exists in Ordnung. Wenn das Ziel darin besteht, festzustellen, ob das Öffnen einer vermutlich vorhandenen Datei sicher ist, ist die Kritik berechtigt und vorhandennicht präzise genug. Leider gibt das OP nicht an, welches das gewünschte Ziel ist (und wird dies wahrscheinlich nicht mehr tun).
    2017-09-05 11: 24: 42Z
  

Wie überprüfe ich, ob eine Datei vorhanden ist, ohne die try-Anweisung zu verwenden?

Im Jahr 2016 ist dies wahrscheinlich die einfachste Methode, um zu überprüfen, ob eine Datei vorhanden ist und ob es sich um eine Datei handelt:

 os.path.isfile

exists ist eigentlich nur eine Hilfsmethode, die intern

import os
os.path.isfile('./file.txt')    # Returns True if exists, else False
und isfile darunter verwendet. Diese os.stat ist eine untergeordnete Methode, mit der Sie detaillierte Informationen zu Dateien, Verzeichnissen, Sockets, Puffern und vielem mehr erhalten. Weitere Informationen zu os.stat finden Sie hier

Hinweis: Bei diesem Ansatz wird die Datei jedoch nicht in irgendeiner Weise gesperrt. Daher kann Ihr Code anfällig werden für " Überprüfungszeitpunkt bis Verwendungszeitpunkt " ( TOCTTOU ) Fehler.

Das Auslösen von Ausnahmen wird daher als akzeptabler und pythonischer Ansatz für die Ablaufsteuerung in Ihrem Programm angesehen. Und man sollte in Betracht ziehen, fehlende Dateien mit IOErrors zu behandeln, anstatt mit stat.S_ISREG(mode)-Anweisungen ( nur ein Ratschlag ).

    
11
2017-05-27 00: 57: 43Z
 os.stat     
9
2015-10-08 21: 22: 53Z
  1. Das sind if und
    import os.path
    
    def isReadableFile(file_path, file_name):
        full_path = file_path + "/" + file_name
        try:
            if not os.path.exists(file_path):
                print "File path is invalid."
                return False
            elif not os.path.isfile(full_path):
                print "File does not exist."
                return False
            elif not os.access(full_path, os.R_OK):
                print "File cannot be read."
                return False
            else:
                print "File can be read."
                return True
        except IOError as ex:
            print "I/O error({0}): {1}".format(ex.errno, ex.strerror)
        except Error as ex:
            print "Error({0}): {1}".format(ex.errno, ex.strerror)
        return False
    #------------------------------------------------------
    
    path = "/usr/khaled/documents/puzzles"
    fileName = "puzzle_1.txt"
    
    isReadableFile(path, fileName)
    
    , richtig?
    08.08.2015 21: 27: 18Z
  2. @ j6m8 Ja, True gibt False zurück, wenn die Datei vom Prozess \program \thread
    erreichbar und lesbar ist
    2015-08-09 07: 46: 31Z
isReadableFile(path,fileName)
Quelle platziert Hier