38 Pytanie: Jak sprawdzić, czy plik istnieje bez wyjątków?

pytanie utworzone w Mon, Nov 5, 2018 12:00 AM

Jak sprawdzić, czy plik istnieje, czy nie, bez korzystania z try instrukcja?

    
5065
  1. Dlaczego chcesz uniknąć wyjątków w Pythonie? Są idiomatycznym sposobem na robienie rzeczy.
    2019-03-27 14: 39: 30Z
  2. Ponieważ jeśli masz ważny fragment kodu w zależności od pliku, który nie istnieje, umieszczenie go w klauzuli except: spowoduje, że będzie to wyjątek w tej części kodu wywoła mylącą wiadomość (drugi błąd zgłoszony podczas przetwarzania pierwszego.)
    2019-05-24 10: 40: 02Z
30 odpowiedzi                              30                         

Jeśli powodem sprawdzenia jest to, że możesz zrobić coś takiego jak if file_exists: open_it(), bezpieczniej jest użyć try przy próbie jego otwarcia. Sprawdzanie, a następnie otwieranie, grozi usunięciem pliku lub przeniesieniem go lub czymś między momentem sprawdzenia a próbą jego otwarcia.

Jeśli nie planujesz natychmiastowego otwarcia pliku, możesz użyć os.path.isfile

  

Zwrot True, jeśli ścieżka jest istniejącym zwykłym plikiem. Podąża za dowiązaniami symbolicznymi, więc zarówno islink () i isfile () może być prawdziwy dla tej samej ścieżki.

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

jeśli musisz być pewien, że jest to plik.

Począwszy od Pythona 3.4, pathlib oferuje podejście obiektowe (przeniesione do pathlib2 w Pythonie 2.7):

from pathlib import Path

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

Aby sprawdzić katalog, wykonaj:

if my_file.is_dir():
    # directory exists

Aby sprawdzić, czy obiekt Path istnieje niezależnie od tego, czy jest to plik czy katalog, użyj exists():

if my_file.exists():
    # path exists

Możesz również użyć resolve(strict=True) w bloku try:

try:
    my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
    # doesn't exist
else:
    # exists
    
4642
2019-05-13 10: 40: 43Z
  1. dotyczący pierwszej uwagi (użyj "try", jeśli zaznaczysz przed otwarciem) niestety nie będzie to działać, jeśli chcesz otworzyć do dodawania, upewniając się, że istnieje przed od 'a' tryb zostanie utworzony, jeśli nie istnieje.
    2018-06-20 07: 58: 09Z
  2. Zauważ, że FileNotFoundError został wprowadzony w Pythonie 3. Jeśli potrzebujesz także obsługi Pythona 2.7 i Pythona 3, możesz zamiast tego użyć IOError (które to FileNotFoundError) stackoverflow.com/a/21368457/1960959
    2019-03-29 13: 44: 15Z
  3. @ makapuf Możesz go otworzyć, aby "zaktualizować" (open('file', 'r+')), a następnie szukać do końca.
    2019-04-30 17: 45: 44Z
  4. os.path.isfile (fname) to wszystko, czego potrzebuję. Dzięki!
    2019-05-30 10: 30: 46Z

Masz os.path.exists funkcja:

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

Zwraca True zarówno dla plików, jak i katalogów, ale możesz zamiast tego użyć

os.path.isfile(file_path)

, aby sprawdzić, czy jest to konkretny plik. Podąża za dowiązaniami symbolicznymi.

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

W przeciwieństwie do isfile() , exists() zwróci True dla katalogów.
W zależności od tego, czy chcesz mieć tylko zwykłe pliki, czy katalogi, użyjesz isfile() lub exists(). Oto proste wyjście REPL.

>>> 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

Użyj os.path.isfile() z 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
2018-07-16 10: 21: 08Z
  1. mając wiele warunków, z których niektóre są zbędne, mniej jest jasne i wyraźne.
    2013-04-09 05: 45: 27Z
  2. Jest także zbędny. Jeśli plik nie istnieje, os.access() zwróci false.
    2018-03-13 00: 01: 19Z
  3. @ EJP W Linuksie pliki mogą istnieć, ale nie są dostępne.
    2018-07-16 21: 30: 18Z
  4. od import os nie musisz ponownie import os.path, ponieważ jest on już częścią os. Musisz tylko zaimportować os.path, jeśli zamierzasz korzystać tylko z funkcji os.path a nie z samego os, aby zaimportować mniejszą rzecz, ale gdy używasz os.access i os.R_OK, drugi import nie jest potrzebny.
    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

Chociaż prawie każdy możliwy sposób został wymieniony w (przynajmniej jednej) istniejących odpowiedziach (np. Python 3.4 dodano konkretne rzeczy), spróbuję zgrupować wszystko razem. >

Uwaga : każdy standardowy kod biblioteki Python , który zamierzam opublikować, należy do wersji 3.5.3 . p>

Oświadczenie o problemie :

  1. Sprawdź plik ( dyskusyjny : również folder („specjalny” plik)?) istnienie
  2. Nie używaj try /except / innego /finally bloki

Możliwe rozwiązania :

  1. [Python 3]: os.path. istnieje ( ścieżka ) (sprawdź także innych członków rodziny funkcji, takich jak os.path.isfile, os.path.isdir, os.path.lexists, aby uzyskać nieco inne zachowania)

    os.path.exists(path)
    
      

    Powrót True, jeśli ścieżka odnosi się do istniejącej ścieżki lub otwartego deskryptora pliku. Zwraca False dla uszkodzonych dowiązań symbolicznych. Na niektórych platformach ta funkcja może zwrócić False, jeśli nie zostanie udzielone zezwolenie na wykonanie os .stat () na żądanym pliku, nawet jeśli ścieżka fizycznie istnieje.

    Wszystko dobrze, ale jeśli śledzisz drzewo importu:

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

      • genericpath.py , wiersz ~#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
        

    to tylko blok try /except wokół [Python 3]: os. stat ( ścieżka, *, dir_fd = None, follow_symlinks = True ) . Twój kod to try /except za darmo, ale niższy w framestacku jest (przynajmniej) jeden taki blok. Dotyczy to również innych funkcji ( w tym os.path.isfile).

    1.1. [Python 3]: Ścieżka. is_file ()

    • To bardziej wyszukany (i więcej python ic) sposób obsługi ścieżek, ale
    • Pod maską dokładnie to samo ( pathlib.py , wiersz ~ # 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]: z menedżerami kontekstów instrukcji . Albo:

    • Utwórz jeden:

      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 ...)
      
      • I jego użycie - powielę zachowanie os.path.isfile (zwróć uwagę, że służy to tylko do celów demonstracyjnych, nie próbuj pisać takiego kodu dla produkcji ):

        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
        
    • Użyj [Python 3]: contextlib. pomiń ( * wyjątki ) - który został specjalnie zaprojektowany do selektywnego tłumienia wyjątków


    Ale wydają się być opakowaniami nad try /except / else /finally , ponieważ [Python 3]: Instrukcja z stanowi:

      

    Pozwala to na powszechne spróbuj ... oprócz ... wreszcie wzorce użycia, które mają być hermetyzowane w celu wygodnego ponownego użycia.

  3. Funkcje przechodzenia systemu plików (i przeszukuj wyniki pod kątem pasujących elementów)


    Ponieważ te iterują po folderach, (w większości przypadków) są one nieefektywne dla naszego problemu (istnieją wyjątki, takie jak nie wildcarded glob bing - jak zauważył @ShadowRanger), więc nie będę na nich nalegał. Nie wspominając o tym, że w niektórych przypadkach może być wymagane przetwarzanie nazw plików.

  4. [Python 3]: os. dostęp ( ścieżka, tryb, *, dir_fd = None, efficient_ids = False, follow_symlinks = True ) , którego zachowanie jest bliskie os.path.exists (właściwie jest szersze, głównie z powodu 2 i argument )

    • Uprawnienia użytkownika mogą ograniczyć „widoczność” pliku, jak podaje dokument:
        

      ... sprawdź, czy wywołujący użytkownik ma określony dostęp do ścieżki . tryb powinien być F_OK , aby przetestować istnienie ścieżki ...

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

    Ponieważ pracuję również w C , korzystam z tej metody, ponieważ pod maską wywołuje macierzysty API s (ponownie, przez "${PYTHON_SRC_DIR} /Modules/posixmodule.c" ), ale otwiera także bramę dla możliwych błędów użytkowników i nie jest to Python ic jak inne warianty. Tak więc, jak słusznie zauważył @AaronHall, nie używaj go, chyba że wiesz, co robisz:

    Uwaga : wywołanie natywnego API s jest również możliwe za pośrednictwem [Python 3]: ctypes - obca biblioteka funkcji dla Pythona , ale w większości przypadków jest bardziej skomplikowana.

    (Win ): Od vcruntime * ( msvcr * ) .dll eksportuje [ Rodzina funkcji MS.Docs]: _access, _waccess , oto przykład:

    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
    

    Uwagi :

    • Chociaż nie jest to dobra praktyka, używam os.F_OK w wywołaniu, ale to tylko dla jasności (jego wartość to 0 )
    • Używam _waccess , aby ten sam kod działał na Python3 i Python2 (pomimo unicode powiązaneróżnice między nimi)
    • Chociaż jest to bardzo konkretny obszar, nie wymieniono go w żadnej z poprzednich odpowiedzi


    Odpowiednik Lnx ( Ubtu (16 x64) ):

    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
    

    Uwagi :

    • Zamiast kodowania ścieżki libc ( "/lib/x86_64-linux-gnu/libc.so.6" ), która może (i najprawdopodobniej będzie) różnią się w zależności od systemu, Brak (lub pusty ciąg) można przekazać do konstruktora CDLL ( ctypes.CDLL(None).access(b"/tmp", os.F_OK) ). Zgodnie z [man7]: DLOPEN (3) :

        

      Jeśli nazwa_pliku ma wartość NULL, to zwrócony uchwyt jest przeznaczony dla głównego   program. Po podaniu dlsym () ten uchwyt powoduje wyszukiwanie a   symbol w programie głównym, a po nim wszystkie udostępnione obiekty załadowane w   uruchomienie programu, a następnie wszystkie udostępnione obiekty ładowane przez dlopen ()   flaga RTLD_GLOBAL .

      • Główny (bieżący) program ( python ) jest powiązany z libc , więc jego symbole (w tym dostęp ) zostaną załadowane
      • Trzeba to obchodzić ostrożnie, ponieważ funkcje takie jak main , Py_Main i (wszystkie) inne są dostępne; wywołanie ich może mieć katastrofalne skutki (w bieżącym programie)
      • Nie dotyczy to również Win (ale to nie jest wielka sprawa, ponieważ msvcrt.dll znajduje się w "% SystemRoot% „ domyślnie w % PATH% . Chciałem podjąć dalsze kroki i powtórzyć to zachowanie w Win (i przesłać poprawkę), ale jak się okazuje, [MS.Docs]: funkcja GetProcAddress „ widzi ” eksportowane symbole, więc chyba że ktoś deklaruje funkcje w głównym pliku wykonywalnym jako __declspec(dllexport) (dlaczego na Ziemi regularny zrobiłby to?), główny program jest ładowany, ale prawie bezużyteczny
  5. Zainstaluj moduł innej firmy z możliwościami systemu plików

    Najprawdopodobniej będzie polegał na jednym z powyższych sposobów (może z niewielkimi modyfikacjami).
    Jednym z przykładów może być (ponownie Win specyficzne) [GitHub]: mhammond /pywin32 - Rozszerzenia Pythona dla Windows (pywin32) , który jest opakowaniem Pythona nad WINAPI s.

    Ale ponieważ jest to bardziej obejście, zatrzymuję się tutaj.

  6. Innym (lame) obejściem ( gainarie ) jest (jak lubię to nazywać) podejście sysadmin : użyj Python jako wrapper do wykonywania poleceń powłoki

    • Wygraj :

      (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
      

Dolna linia :

  • Wykonaj użyj try /except / inaczej /finally bloki, ponieważ mogą one uniemożliwić uruchomienie serii nieprzyjemnych problemów. Kontrprzykładem, o którym myślę, jest wydajność: takie bloki są kosztowne, więc staraj się nie umieszczać ich w kodzie, który ma działać setki tysięcy razy na sekundę (ale ponieważ (w większości przypadków) wymaga dostępu do dysku tak nie będzie).

Ostatnia uwaga :

  • Postaram się być na bieżąco, wszelkie sugestie są mile widziane, włączę wszystko, co będzie przydatne w odpowiedzi
216
2019-02-08 09: 36: 33Z
  1. Czy możesz omówić to stwierdzenie? „Chociaż nie jest to dobra praktyka, używam os.F_OK w wywołaniu, ale to tylko dla jasności (jego wartość wynosi 0)”
    2017-11-19 01: 46: 40Z
  2. @ sk8asd123: Trochę trudno to zrobić w komentarzu: ogólnie najlepiej używać stałych z funkcjami, z którymi się łączą. Dotyczy to pracy z wieloma modułami, które definiują tę samą stałą, ponieważ niektóre mogą nie być aktualne, a najlepiej, aby funkcje i stałe były zsynchronizowane. Podczas pracy z ctypes (wywołanie funkcji bezpośrednio) powinienem zdefiniować stałą (z MSDN ) lub nie używać stałej. Jegotylko wskazówka, której używam, w 99,9% prawdopodobnie nie ma różnicy (funkcjonalnie).
    2017-11-19 23: 54: 34Z
  3. @ CristiFati: Od 3.6, glob.iglob (a także glob.glob) są oparte na os.scandir , więc jest teraz leniwy; aby uzyskać pierwsze trafienie w katalogu plików 10M, skanujesz tylko do momentu osiągnięcia pierwszego trafienia. A nawet przed 3.6, jeśli używasz metod glob bez symboli wieloznacznych, funkcja jest inteligentna: wie, że możesz mieć tylko jedno trafienie, więc upraszcza globowanie tylko do os.path.isdir lub os.path.lexists (w zależności od tego, czy ścieżka kończy się /).
    2017-11-29 18: 29: 02Z
  4. Ta druga część mojego komentarza (globbing bez symboli wieloznacznych w rzeczywistości nie iteruje folderu i nigdy go nie ma) oznacza, że ​​jest to doskonale skuteczne rozwiązanie problemu (wolniej niż bezpośrednie połączenie os.path.isdir lub os.path.lexist, ponieważ jest to kilka wywołań funkcji na poziomie Pythona i operacji łańcuchowych, zanim zdecyduje, że efektywna ścieżka jest opłacalna, ale nie ma dodatkowego wywołania systemowego ani pracy we /wy, która jest o rząd wielkości wolniejsza.
    2017-11-29 18: 38: 49Z

    To najprostszy sposób na sprawdzenie, czy plik istnieje. Po prostu , ponieważ plik istniał, gdy zaznaczyłeś, nie gwarantuje , że pojawi się, gdy będziesz musiał go otworzyć.

    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
    2018-01-14 04: 07: 53Z
    1. Dopóki masz zamiar uzyskać dostęp do pliku, warunek wyścigu istnieje , bez względu na to, jak został zbudowany Twój program. Twój program nie może zagwarantować, że inny proces na komputerze nie zmodyfikował pliku. To właśnie Eric Lippert określa jako egzogeniczny wyjątek . Nie możesz tego uniknąć, sprawdzając wcześniej istnienie pliku.
      2014-11-23 18: 37: 59Z
    2. @ IsaacSupeene Najlepszą praktyką jest uczynienie okna operacji (pliku) możliwie najmniejszym, a następnie odpowiednia obsługa wyjątków
      2018-07-28 02: 52: 48Z

    Python 3.4+ ma moduł ścieżki obiektowej: pathlib . Korzystając z tego nowego modułu, możesz sprawdzić, czy plik istnieje w następujący sposób:

    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
    

    Możesz (i zwykle powinieneś) nadal używać bloku try/except podczas otwierania plików:

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

    Moduł pathlib zawiera wiele fajnych rzeczy: wygodny globbing, sprawdzanie właściciela pliku, łatwiejsze łączenie ścieżek itp. Warto to sprawdzić. Jeśli używasz starszego Pythona (wersja 2.6 lub nowsza), nadal możesz zainstalować pathlib za pomocą pip:

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

    Następnie zaimportuj go w następujący sposób:

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

    Preferuj instrukcję try. Uważany jest za lepszy styl i unika warunków wyścigowych.

    Nie wierz mi na słowo. Istnieje wiele wsparcia dla tej teorii. Oto para:

    117
    2014-04-28 01: 01: 59Z
    1. Dodaj lepsze źródła, aby wesprzeć swoje oświadczenie.
      2015-09-10 09: 09: 37Z
    2. Cytowany link Avoiding Race Conditions (wsparcie Apple Dev) nie obsługuje twojej odpowiedzi. Dotyczy to tylko używania plików tymczasowych, które zawierają poufne informacje o źle zaprojektowanych systemach operacyjnych, które nie zawierają poprawnie plików tymczasowych /katalogów za pomocą ograniczonych uprawnień. Użycie try...except i tak nie pomaga rozwiązać problemu tego .
      2015-09-28 15: 38: 00Z
    3. @ chrisz Nie sądzę, że jest to tylko link - w rzeczywistości zawiera informacje inne niż link.
      2018-02-19 04: 30: 09Z
    4. Problem z tą metodą polega na tym, że jeśli masz ważny fragment kodu w zależności od nieistniejącego pliku, umieszczenie go w klauzuli except: spowoduje powstanie wyjątku w tej części kodu pojawi się myląca wiadomość (drugi błąd zgłoszony podczas przetwarzania pierwszego.)
      2019-05-24 10: 43: 34Z
      

    Jak sprawdzić, czy plik istnieje, używając Pythona, bez użycia instrukcji try?

    Teraz dostępny od wersji Python 3.4, importuj i twórz obiekt Path o nazwie pliku i sprawdź metodę is_file (zwróć uwagę, że zwraca to wartość True dla dowiązań symbolicznych wskazujących również na zwykłe pliki):

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

    Jeśli korzystasz z Pythona 2, możesz przenieść moduł pathlib z pypi, pathlib2 lub w inny sposób sprawdź isfile z modułu os.path:

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

    Teraz powyższe jest prawdopodobnie najlepszą pragmatyczną bezpośrednią odpowiedzią tutaj, ale istnieje możliwość wystąpienia sytuacji wyścigu (w zależności od tego, co próbujesz osiągnąć) oraz faktu, że podstawowa implementacja używa try, ale Python używa try wszędzie w jego realizacji.

    Ponieważ Python używa wszędzie try, nie ma powodu, aby unikać implementacji, która go używa.

    Ale reszta tej odpowiedzi próbuje rozważyć te zastrzeżenia.

    Dłuższa, znacznie bardziej pedantyczna odpowiedź

    Dostępne od Pythona 3.4, użyj nowego obiektu Path w pathlib. Zauważ, że .exists nie jest w porządku, ponieważ katalogi nie są plikami (z wyjątkiem unixowego sensu, że wszystko jest plikiem). /p>

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

    Więc musimy użyć is_file:

    >>> root.is_file()
    False
    

    Oto pomoc na is_file:

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

    Przyjmijmy więc plik, który znamy, jest plikiem:

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

    Domyślnie NamedTemporaryFile usuwa plik po jego zamknięciu (i automatycznie zamyka się, gdy nie istnieją już żadne odniesienia do niego).

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

    Jeśli zagłębisz się w implementację , zobaczysz, że is_file używa try:

    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
    

    Warunki wyścigu: Dlaczego lubimy próbować

    Lubimy try, ponieważ pozwala uniknąć warunków wyścigowych. Z try po prostu próbujesz odczytać plik, spodziewając się, że tam będzie, a jeśli nie, przechwycisz wyjątek i wykonasz dowolne zachowanie awaryjne.

    Jeśli chcesz sprawdzić, czy plik istnieje, zanim podejmiesz próbę jego odczytania i możesz go usunąć, a następnie możesz używać wielu wątków lub procesów, lub inny program wie o tym pliku i może go usunąć - ryzykujesz szansa na kondycję wyściguon , jeśli go zaznaczysz, ponieważ wtedy ściga się , aby go otworzyć, zanim zmieni się jego warunek (jego istnienie).

    Warunki wyścigu są bardzo trudne do debugowania, ponieważ istnieje bardzo małe okno, w którym mogą spowodować awarię programu.

    Ale jeśli to jest twoja motywacja, możesz uzyskać wartość instrukcji try, używając menedżera kontekstu suppress.

    Unikanie warunków wyścigu bez oświadczenia próbnego: suppress

    Python 3.4 daje nam suppress menedżer kontekstu (poprzednio ignore menedżer kontekstu), który robi semantycznie dokładnie to samo w mniejszej liczbie wierszy, a jednocześnie (przynajmniej powierzchownie ) spotkanie z oryginalnym pytaniem, aby uniknąć oświadczenia try:

    from contextlib import suppress
    from pathlib import Path
    

    Użycie:

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

    W przypadku wcześniejszych Pythonów można rzucić własnym suppress, ale bez try będzie bardziej gadatliwy niż z. Wierzę, że jest to jedyna odpowiedź, która nie używa try na żadnym poziomie w Pythonie , którą można zastosować przed Pythonem 3.4, ponieważ zamiast tego używa menedżera kontekstu:

    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)
    

    Być może łatwiej będzie spróbować:

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

    Inne opcje, które nie spełniają pytania „bez próby”:

    przerażenie

    import os
    os.path.isfile(path)
    

    z dokumentów :

      

    os.path.isfile(path)

         

    Zwróć True, jeśli ścieżka jest istniejącym zwykłym plikiem. To następuje symbolicznie   linki, więc zarówno islink(), jak i isfile() mogą być prawdziwe dla tej samej ścieżki.

    Ale jeśli przejrzysz źródło tego funkcja, zobaczysz, że faktycznie używa instrukcji try:

    # 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
    

    Wszystko, co robi, to użycie podanej ścieżki, aby sprawdzić, czy może uzyskać statystyki, przechwytując OSError, a następnie sprawdzając, czy jest to plik, jeśli nie zgłosił wyjątku.

    Jeśli zamierzasz coś zrobić z plikiem, sugerowałbym bezpośrednią próbę za pomocą próby - z wyjątkiem uniknięcia sytuacji wyścigu:

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

    os.access

    Dostępne dla systemów Unix i Windows to os.access, ale aby użyć, musisz przekazać flagi, a nie rozróżnia plików i katalogów. Jest to bardziej wykorzystywane do testowania, czy prawdziwy wywołujący użytkownik ma dostęp w podwyższonym środowisku uprawnień:

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

    Cierpi również na te same problemy z warunkami wyścigu co isfile. Z dokumenty :

      

    Uwaga:   Korzystanie z dostępu () w celu sprawdzenia, czy użytkownik jest upoważniony do np. otworzyć plik   przed faktycznym użyciem open () tworzy lukę bezpieczeństwa, ponieważ   użytkownik może wykorzystać krótki odstęp czasu między sprawdzeniem i   otwieranie pliku w celu manipulowania nim. Lepiej jest korzystać z EAFP   techniki. Na przykład:

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

    jest lepiej napisane jako:

    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()
    

    Unikaj używania os.access. Jest to funkcja niskiego poziomu, która ma więcej możliwości błędu użytkownika niż obiekty i funkcje wyższego poziomu omówione powyżej.

    Krytyka innej odpowiedzi:

    Inna odpowiedź mówi o os.access:

      

    Osobiście wolę ten, ponieważ pod maską wywołuje natywne API (za pośrednictwem „${PYTHON_SRC_DIR} /Modules/posixmodule.c”), ale otwiera również bramę dla możliwych błędów użytkownika i nie jest tak jak Pythonic jak inne warianty:

    Ta odpowiedź mówi, że preferuje metodę niepythoniczną, podatną na błędy, bez uzasadnienia. Wydaje się, że zachęca użytkowników do korzystania z niskopoziomowych interfejsów API bez ich zrozumienia.

    Tworzy również menedżera kontekstu, który bezwarunkowo zwracając True, pozwala na przejście wszystkich wyjątków (w tym KeyboardInterrupt i SystemExit!), co jest dobrym sposobem na ukrycie błędów.

    Wydaje się, że zachęca to użytkowników do przyjęcia złych praktyk.

        
    110
    2018-02-25 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!"
    

    Importowanie os ułatwia nawigację i wykonywanie standardowych działań w systemie operacyjnym.

    Zobacz także Jak sprawdzić, czy plik istnieje za pomocą Pythona?

    Jeśli potrzebujesz operacji wysokiego poziomu, użyj shutil.

        
    82
    2017-05-16 16: 36: 46Z
    1. Ta odpowiedź jest błędna. os.path.exists zwraca wartość true dla rzeczy, które nie są plikami, takich jak katalogi. Daje to fałszywe alarmy. Zobacz inne odpowiedzi, które polecają os.path.isfile.
      2015-08-01 13: 56: 22Z

    Testowanie plików i folderów za pomocą os.path.isfile(), os.path.isdir() i os.path.exists()

    Zakładając, że „ścieżka” jest prawidłową ścieżką, ta tabela pokazuje, co jest zwracane przez każdą funkcję dla plików i folderów:

    wprowadź opis obrazu tutaj>> </p>

<p> Możesz również sprawdzić, czy plik jest określonym typem pliku, używając <code>os.path.splitext()</code>, aby uzyskać rozszerzenie (jeśli jeszcze go nie znasz) </p>

<pre><code>>>> import os
>>> path =     

    76
    2016-10-08 12: 43: 02Z

    W 2016 najlepszym sposobem jest nadal używanie os.path.isfile:

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

    Lub w Pythonie 3 możesz użyć pathlib:

    import pathlib
    path = pathlib.Path('/path/to/some/file.txt')
    if path.is_file():
        ...
    
        
    67
    2017-05-27 01: 00: 22Z
    1. Mogę zapytać: Jaka jest zaleta używania modułu 'pathlib' zamiast modułu 'os' w python3 do tego sprawdzenia?
      2016-02-25 08: 55: 33Z
    2. pathlib jest rozwiązaniem OOP Pythona dla ścieżek. Możesz zrobić z nim o wiele więcej. Jeśli po prostu musisz sprawdzić istnienie, przewaga nie jest tak duża.
      2016-02-25 10: 44: 49Z

    Wydaje się, że nie ma znaczącej różnicy funkcjonalnej między try /except i isfile(), więc powinieneś użyć tego, który ma sens.

    Jeśli chcesz przeczytać plik, jeśli istnieje, zrób

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

    Ale jeśli chcesz zmienić nazwę pliku, jeśli istnieje, a zatem nie musisz go otwierać, zrób

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

    Jeśli chcesz pisać do pliku, jeśli nie istnieje, zrób

    # 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'
    

    Jeśli potrzebujesz blokowania plików, to inna sprawa.

        
    62
    2015-08-25 03: 12: 24Z
    1. Ta odpowiedź jest błędna. os.path.exists zwraca wartość true dla rzeczy, które nie są plikami, takich jak katalogi. Daje to fałszywe alarmy. Zobacz inne odpowiedzi, które polecają os.path.isfile.
      2015-08-01 13: 54: 35Z
    2. W twoim trzecim przykładzie tworzę link o nazwie filepath z odpowiednim czasem, a BAM zastępujesz plik docelowy. Powinieneś zrobić open(filepath, 'wx') w bloku try...except, aby uniknąć problemu.
      2015-08-24 14: 05: 09Z
    3. W drugim przykładzie, przynajmniej w systemie Windows, otrzymasz OSError, jeśli filepath + '.old' już istnieje: „W Windows, jeśli dst już istnieje, błąd OSError zostanie podniesiony, nawet jeśli jest to plik; może nie być możliwości zaimplementowania atomowej zmiany nazwy, gdy dst nazywa istniejący plik. ”
      2016-05-24 14: 14: 04Z
    4. @ TomMyddeltyn: Od wersji Python 3.3, os.replace wykonuje cichą wymianę pliku docelowego (jest identyczny z zachowaniem Linuksa os.rename) (błędy tylko, jeśli istnieje nazwa docelowa i jest to katalog). Więc utknąłeś na 2.x, ale użytkownicy Py3 mają dobrą opcję od kilku lat.
      2017-11-29 18: 14: 56Z
    5. W przykładzie rename: nadal należy to zrobić za pomocą try/except. os.rename (lub os.replace w nowoczesnym Pythonie) jest atomowy; sprawdzenie, a następnie zmiana nazwy wprowadza niepotrzebny wyścig i dodatkowe wywołania systemowe. Po prostu zrób try: os.replace(filepath, filepath + '.old') except OSError: pass
      2017-11-29 18: 17: 31Z

    Możesz spróbować tego (bezpieczniej):

    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))
    

    Wyjście byłoby:

      

    ([Errno 2] Brak takiego pliku lub katalogu:   'whatever.txt')

    Następnie, w zależności od wyniku, twój program może po prostu kontynuować działanie lub możesz kodować, aby go zatrzymać, jeśli chcesz.

        
    53
    2017-05-27 00: 43: 51Z
    1. Pierwotne pytanie wymagało rozwiązania, które nie używa try
      2014-04-23 13: 10: 01Z
    2. Ta odpowiedź pomija punkt OP. Sprawdzanie, czy plik istnieje, nie jest tym samym, co sprawdzenie, czy można go otworzyć. Będą przypadki, w których plik istnieje, ale z różnych powodów nie można go otworzyć.
      2016-02-17 18: 52: 12Z

    Chociaż zawsze zalecam korzystanie z instrukcji try i except, oto kilka możliwości dla Ciebie (mój osobisty ulubiony używa os.access):

    1. Spróbuj otworzyć plik:

      Otwarcie pliku zawsze weryfikuje istnienie pliku. Możesz stworzyć taką funkcję:

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

      Jeśli jest to Fałsz, zatrzyma wykonywanie za pomocą nieobsługiwanego błędu IOError lub OSError w nowszych wersjach Pythona. Aby złapać wyjątek, musisz użyć klauzuli try except. Oczywiście zawsze możesz użyj instrukcji try z wyjątkiem tego typu (dzięki hsandt za myślenie):

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

      Sprawdzi to, co określiłeś. Jednak sprawdza pliki i , więc uważaj na to, jak z nich korzystasz.

      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. Użyj os.access(path, mode):

      Spowoduje to sprawdzenie, czy masz dostęp do pliku. Będzie sprawdzać uprawnienia. Na podstawie dokumentacji os.py wpisując os.F_OK sprawdzi, czy ścieżka istnieje. Jednak użycie tego spowoduje lukę w zabezpieczeniach, ponieważ ktoś może zaatakować plik, wykorzystując czas między sprawdzeniem uprawnień a otwarciem pliku. Zamiast tego powinieneś przejść bezpośrednio do otwierania pliku, zamiast sprawdzać jego uprawnienia. ( EAFP a LBYP ). Jeśli nie zamierzasz później otwierać pliku i tylko sprawdzać jego istnienie, możesz go użyć.

      W każdym razie tutaj:

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

    Powinienem również wspomnieć, że istnieją dwa sposoby, że nie będziesz w stanie zweryfikować istnienia pliku. Albo problem będzie permission denied lub no such file or directory. Jeśli złapiesz IOError, ustaw IOError as e (jak moja pierwsza opcja), a następnie wpisz print(e.args), aby mieć nadzieję, że możesz określić swój problem. Mam nadzieję, że to pomoże! :)

        
    48
    2017-05-27 00: 52: 18Z

    Data: 2017-12-04

    Każde możliwe rozwiązanie zostało wymienione w innych odpowiedziach.

    Intuicyjny i dyskusyjny sposób sprawdzenia, czy plik istnieje, jest następujący:

    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')
    

    Zrobiłem wyczerpujący arkusz kalkulacyjny w celach informacyjnych:

    #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']}
    
        
    42
    2018-12-23 10: 46: 13Z

    Dodatkowo os.access():

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

    Będąc R_OK, W_OK i X_OK flagi do testowania uprawnień ( doc ).

        
    33
    2016-05-04 15: 24: 02Z

    Jeśli plik służy do otwierania, możesz użyć jednej z następujących technik:

    >>> 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!')
    

    UPDATE

    Aby uniknąć nieporozumień i bazując na odpowiedziach, bieżąca odpowiedź znajduje plik lub katalog o podanej nazwie.

        
    30
    2018-07-22 19: 12: 53Z
    1. Ta odpowiedź jest błędna. os.path.exists zwraca wartość true dla rzeczy, które nie są plikami, takich jak katalogi. Daje to fałszywe alarmy. Zobacz inne odpowiedzi, które polecają os.path.isfile.
      2015-08-01 13: 55: 01Z
    2. dostał także fałszywy pozytywny problem.
      2018-05-19 21: 33: 55Z
    3. docs.python.org/3/library/os.path.html#os.path.exists Do powyższej instrukcji z chris > > os.path.exists (ścieżka) > Zwróć True, jeśli ścieżka odnosi się do istniejącej ścieżki lub otwartego deskryptora pliku. Zwraca Fałsz dla zerwanych dowiązań symbolicznych. Na niektórych platformach ta funkcja może zwracać wartość False, jeśli nie zostanie udzielone uprawnienie do wykonania os.stat () na żądanym pliku, nawet jeśli ścieżka fizycznie istnieje. Zmieniono w wersji 3.3: ścieżka może teraz być liczbą całkowitą: True jest zwracane, jeśli jest otwartym deskryptorem pliku, False w przeciwnym razie. Zmieniono w wersji 3.6: Akceptuje obiekt podobny do ścieżki.
      2018-08-31 23: 24: 22Z
    if os.path.isfile(path_to_file):
        try: 
            open(path_to_file)
                pass
        except IOError as e:
            print "Unable to open file"
    
      

    Podnoszenie wyjątków jest uważane za akceptowalne i Pythonic,   podejście do kontroli przepływu w twoim programie. Rozważ brak obsługi   pliki z IOErrors. W tej sytuacji będzie wyjątek IOError   podniesiony, jeśli plik istnieje, ale użytkownik nie ma uprawnień do odczytu.

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

        
    20
    2015-07-18 17: 41: 08Z
    1. OP zapytał, jak sprawdzić, czy plik istnieje. Plik może istnieć, ale nie możesz go otworzyć. Dlatego użycie pliku jako serwera proxy do sprawdzenia, czy plik istnieje, nie jest poprawne: będzie miało fałszywe wyniki negatywne.
      2016-02-17 18: 58: 54Z

    Jeśli zaimportowałeś już NumPy do innych celów, nie ma potrzeby importowania innych bibliotek, takich jak pathlib, os, paths itd.

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

    Spowoduje to zwrócenie prawdy lub fałszu na podstawie jego istnienia.

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

    Możesz napisać sugestię Briana bez try:.

    from contextlib import suppress
    
    with suppress(IOError), open('filename'):
        process()
    

    suppress jest częścią Pythona 3.4. W starszych wersjach możesz szybko napisać własne wyłączenie:

    from contextlib import contextmanager
    
    @contextmanager
    def suppress(*exceptions):
        try:
            yield
        except exceptions:
            pass
    
        
    17
    2017-05-27 00: 48: 31Z

    Sprawdź plik lub katalog istnieje

    Możesz podążać za tymi trzema sposobami:

      

    Uwaga1: os.path.isfile używane tylko dla plików

    import os.path
    os.path.isfile(filename) # True if file exists
    os.path.isfile(dirname) # False if directory exists
    
      

    Uwaga2: os.path.exists używane zarówno dla plików, jak i katalogów

    import os.path
    os.path.exists(filename) # True if file exists
    os.path.exists(dirname) #True if directory exists
    
      

    Metoda pathlib.Path (zawarta w Pythonie 3+, instalowana za pomocą pip dla Pythona 2)

    from pathlib import Path
    Path(filename).exists()
    
        
    16
    2018-03-04 06: 24: 37Z

    Dodając jeszcze jedną drobną odmianę, która nie jest dokładnie odzwierciedlona w innych odpowiedziach.

    Zajmie się przypadkiem file_path będącym None lub pustym łańcuchem.

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

    Dodanie wariantu na podstawie sugestii Shahbaza

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

    Dodanie wariantu na podstawie sugestii Petera Wooda

    def file_exists(file_path):
        return file_path and os.path.isfile(file_path):
    
        
    15
    2017-04-07 16: 10: 59Z
    1. if (x) return true; else return false; to naprawdę tylko return x. Twoje cztery ostatnie linie mogą mieć postać return os.path.isfile(file_path). W tym czasie cała funkcja może zostać uproszczona jako return file_path and os.path.isfile(file_path).
      2017-01-04 22: 50: 16Z
    2. W przypadku return x należy zachować ostrożność w przypadku if (x). Python rozważy pusty łańcuch False, w którym to przypadku będziemy zwracać pusty łańcuch zamiast bool. Celem tej funkcji jest zawsze zwracanie bool.
      2017-01-05 17: 08: 43Z
    3. Prawda. W tym przypadku jednak x to os.path.isfile(..), więc jest to już bool.
      2017-01-05 17: 10: 24Z
    4. os.path.isfile(None) podnosi wyjątek, dlatego dodałem check if. Prawdopodobnie mógłbym to po prostu zawinąć w próbie /ale zamiast tego, ale czułem, że w ten sposób było to bardziej wyraźne
      2017-01-05 17: 13: 10Z
    5. return file_path and os.path.isfile(file_path)
      2017-04-06 10: 35: 01Z

    Jestem autorem pakietu, który istnieje od około 10 lat i ma funkcję, która bezpośrednio odpowiada na to pytanie. Zasadniczo, jeśli używasz systemu innego niż Windows, używa on Popen, aby uzyskać dostęp do find.jeśli jesteś w systemie Windows, replikuje on find z wydajnym walkerem systemu plików.

    Sam kod nie używa bloku try… poza określeniem systemu operacyjnego i tym samym przejściem do stylu „Unix” find lub podręcznika find. Testy czasowe wykazały, że try jest szybszy w określaniu systemu operacyjnego , więc użyłem jednego tam (ale nigdzie indziej).

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

    I doc…

    >>> 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']
    
    >>>
    

    Implementacja, jeśli chcesz to zobaczyć, jest tutaj: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9 /pox/shutils.py#L190

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

    Oto 1-liniowa komenda Pythona dla środowiska wiersza komend systemu Linux. Znajduję to BARDZO RĘCZNIE, ponieważ nie jestem takim gorącym facetem Basha.

    python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"
    

    Mam nadzieję, że to jest pomocne.

        
    14
    2015-08-29 16: 15: 29Z
    1. Sprawdzanie w jednym wierszu w bash: [ -f "${file}" ] && echo "file found" || echo "file not found" (to samo co if [ ... ]; then ...; else ...; fi).
      2015-10-01 07: 48: 29Z

    Możesz użyć biblioteki „OS” Pythona:

    >>> import os
    >>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") 
    True
    >>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
    False
    
        
    11
    2017-05-27 00: 49: 25Z
    1. Ta odpowiedź jest błędna. os.path.exists zwraca wartość true dla rzeczy, które nie są plikami, takich jak katalogi. Daje to fałszywe alarmy. Zobacz inne odpowiedzi, które polecają os.path.isfile.
      2015-08-01 13: 55: 13Z
    2. @ Chris Johnson, funkcja os.path.exists () sprawdza, czy ścieżka istnieje w systemie. PATH może być DIRECTORY lub FILE. To działa dobrze w obu przypadkach. Spróbuj z pewnym przykładem
      2015-08-02 14: 51: 41Z
    3. Więc ta odpowiedź działa. Świetny. Iff ścieżka nie jest ścieżką pliku. Czy o to chodziło w tym pytaniu? Nie.
      2016-04-14 23: 33: 56Z
    4. To zależy. Jeśli celem określenia istnienia „pliku” jest ustalenie, czy ścieżka już istnieje (a zatem nie jest ścieżką, na której można przechowywać nowe dane bez usuwania innych informacji), to exists jest w porządku. Jeśli celem jest ustalenie, czy otwarcie pliku prawdopodobnie jest bezpieczne, wówczas krytyka jest uzasadniona i nie jest wystarczająco precyzyjna. Niestety, OP nie określa, który cel jest pożądany (i prawdopodobnie już tego nie zrobi).
      2017-09-05 11: 24: 42Z
      

    Jak sprawdzić, czy plik istnieje, bez użycia instrukcji try?

    W 2016 r. jest to nadal prawdopodobnie najłatwiejszy sposób sprawdzenia, czy zarówno plik istnieje, jak i jest plikiem:

    import os
    os.path.isfile('./file.txt')    # Returns True if exists, else False
    

    isfile jest właściwie tylko metodą pomocniczą, która wewnętrznie używa pod spodem os.stat i stat.S_ISREG(mode). Ta os.stat to metoda niższego poziomu, która zapewni szczegółowe informacje o plikach, katalogach, gniazdach, buforach i innych. Więcej o os.stat tutaj

    Uwaga: to podejście nie zablokuje pliku w żaden sposóbdlatego Twój kod może stać się podatny na błędy „ czasu kontroli do czasu użycia ” ( TOCTTOU ).

    Zatem podnoszenie wyjątków jest uważane za akceptowalne, a Pythonic podejście do sterowania przepływem w programie. Należy rozważyć obsługę brakujących plików za pomocą instrukcji IOErrors, a nie instrukcji if ( tylko rada ).

        
    11
    2017-05-27 00: 57: 43Z
    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)
    
        
    9
    2015-10-08 21: 22: 53Z
    1. to True i False, prawo ..?
      2015-08-08 21: 27: 18Z
    2. @ j6m8 yes, isReadableFile(path,fileName) zwróci True, jeśli plik jest osiągalny i możliwy do odczytania przez proces
      2015-08-09 07: 46: 31Z
źródło umieszczone tutaj