Jak sprawdzić, czy plik istnieje, czy nie, bez użycia try
instrukcji?
python
file
file-exists
spence91
źródło
źródło
Odpowiedzi:
Jeśli sprawdzasz, że możesz zrobić coś takiego
if file_exists: open_it()
, bezpieczniej jest skorzystaćtry
z próby otwarcia. Sprawdzanie, a następnie otwieranie grozi usunięciem lub przeniesieniem pliku lub czymś innym między sprawdzaniem a próbą otwarcia.Jeśli nie planujesz natychmiast otworzyć pliku, możesz użyć
os.path.isfile
jeśli musisz się upewnić, że jest to plik.
Począwszy od Python 3.4,
pathlib
moduł oferuje podejście obiektowe (przeniesione dopathlib2
Pythona 2.7):Aby sprawdzić katalog, wykonaj:
Aby sprawdzić, czy
Path
obiekt istnieje niezależnie od tego, czy jest to plik czy katalog, użyjexists()
:Możesz także użyć
resolve(strict=True)
wtry
bloku:źródło
FileNotFoundError
został wprowadzony w Pythonie 3. Jeśli potrzebujesz także obsługiwać Python 2.7 oraz Python 3, możeszIOError
zamiast tego użyć (któreFileNotFoundError
podklasy) stackoverflow.com/a/21368457/1960959open('file', 'r+')
), a następnie przejść do końca.Masz
os.path.exists
funkcję:Zwraca
True
zarówno pliki, jak i katalogi, ale możesz zamiast tego użyćaby sprawdzić, czy jest to konkretnie plik. Podąża za dowiązaniami symbolicznymi.
źródło
W przeciwieństwie do
isfile()
,exists()
wróciTrue
po katalogi. W zależności od tego, czy chcesz tylko zwykłe pliki, czy też katalogi, użyjeszisfile()
lubexists()
. Oto kilka prostych wyników REPL:źródło
źródło
Użyj
os.path.isfile()
zos.access()
:źródło
os.access()
zwróci false.import os
musisz tego robić,import os.path
ponieważ jest to już częśćos
. Musisz tylko zaimportować,os.path
jeśli zamierzasz używać funkcji z siebie,os.path
a nie odos
siebie, aby zaimportować mniejszą rzecz, ale podczas używaniaos.access
ios.R_OK
drugi import nie jest potrzebny.źródło
Chociaż prawie każdy możliwy sposób został wymieniony w (przynajmniej jednej) istniejących odpowiedziach (np. Dodano specyficzne rzeczy w Pythonie 3.4 ), spróbuję pogrupować wszystko razem.
Uwaga : każdy fragment standardowego kodu biblioteki Python, który zamierzam opublikować, należy do wersji 3.5.3 .
Opis problemu :
Możliwe rozwiązania :
[Python 3]: os.path. istnieje ( ścieżka ) (też sprawdzić innych członków rodziny, takich jak funkcja
os.path.isfile
,os.path.isdir
,os.path.lexists
dla nieco odmiennych zachowań)Wszystko dobrze, ale jeśli śledzisz drzewo importu:
os.path
- posixpath.py ( ntpath.py )genericpath.py , linia ~ # 20 +
to tylko próba / z wyjątkiem bloku wokół [Python 3]: os. stat ( ścieżka, *, dir_fd = Brak, follow_symlinks = True ) . Więc twój kod jest wypróbowany / z wyjątkiem darmowego, ale na dole framestacka jest (przynajmniej) jeden taki blok. Dotyczy to również innych funkcji (w tym
os.path.isfile
).1.1 [Python 3]: Ścieżka. is_file ()
Pod maską robi dokładnie to samo ( pathlib.py , linia ~ # 1330 ):
[Python 3]: Z menedżerami kontekstu instrukcji . Zarówno:
Stworzyć jeden:
I jego użycie - powtórzę to
os.path.isfile
zachowanie (pamiętaj, że jest to tylko w celach demonstracyjnych, nie próbuj pisać takiego kodu do produkcji ):Użyj [Python 3]: contextlib. suppress ( * wyjątki ) - który został specjalnie zaprojektowany do selektywnego tłumienia wyjątków
Ale wydają się być owijarki ponad próbie / z wyjątkiem / else / wreszcie bloki, jak [Python 3]: z rachunku stanów:
Funkcje przechodzenia przez system plików (i wyszukaj wyniki dla pasujących elementów)
[Python 3]: os. listdir ( ścieżka = '.' ) (lub [Python 3]: os. scandir ( ścieżka = '.' ) w Pythonie w wersji 3.5 +, backport: [PyPI]: scandir )
Obaj używają pod maską:
przez [GitHub]: python / cpython - (master) cpython / Modules / posixmodule.c
os.listdir
(os.scandir
gdy dostępne)glob.glob
)os.listdir
Ponieważ powtarzają się one po folderach (w większości przypadków) są nieefektywne w przypadku naszego problemu (są wyjątki, takie jak glob bing bez symboli wieloznacznych - jak wskazał @ShadowRanger), więc nie będę nalegał na nie. Nie wspominając o tym, że w niektórych przypadkach przetwarzanie plików może być wymagane.
[Python 3]: os. access ( ścieżka, tryb, *, dir_fd = Brak, efektywne_ids = Fałsz, follow_symlinks = True ), którego zachowanie jest bliskie
os.path.exists
(w rzeczywistości jest szersze, głównie z powodu drugiego argumentu)os.access("/tmp", os.F_OK)
Ponieważ pracuję także w C , używam tej metody, jak również dlatego, że pod maską, wywołuje natywne API s (znów przez „$ {PYTHON_SRC_DIR} /Modules/posixmodule.c” ), ale także otwiera furtkę dla ewentualnego użytkownika błędy i nie jest tak Python ic jak inne warianty. Tak jak słusznie zauważył @AaronHall, nie używaj go, chyba że wiesz, co robisz:
Uwaga : wywoływanie natywnego API jest również możliwe przez [Python 3]: ctypes - Biblioteka funkcji obcych dla Pythona , ale w większości przypadków jest bardziej skomplikowana.
(W szczególności dla Win ): Ponieważ vcruntime * ( msvcr * ) .dll eksportuje [MS.Docs]: _access, a także rodzinę funkcji _waccess , oto przykład:
Uwagi :
os.F_OK
tego połączenia, ale to tylko dla jasności (jego wartość wynosi 0 )Odpowiednik Lnx ( Ubtu (16 x64) ):
Uwagi :
Zamiast tego na stałe ścieżka libc ( „/lib/x86_64-linux-gnu/libc.so.6” ), która może (i najprawdopodobniej będzie się różnić) w różnych systemach, Brak (lub pusty ciąg) może zostać przekazany do konstruktora CDLL (
ctypes.CDLL(None).access(b"/tmp", os.F_OK)
). Według [man7]: DLOPEN (3) :__declspec(dllexport)
(dlaczego na Ziemi zwykła osoba miałaby to robić?), główny program jest wczytywalny, ale praktycznie bezużytecznyZainstaluj moduł innej firmy z funkcjami systemu plików
Najprawdopodobniej będzie polegać na jednym z powyższych sposobów (może z niewielkimi dostosowaniami).
Jednym z przykładów byłoby (ponownie, specyficzne dla Win ) [GitHub]: mhammond / pywin32 - Rozszerzenia Python dla Windows (pywin32) , które są opakowaniem Pythona w WINAPI .
Ale ponieważ jest to raczej obejście, zatrzymuję się tutaj.
Innym (kiepskim) obejściem ( gainarie ) jest (jak to nazywam) podejście sysadmin : użyj Pythona jako opakowania do wykonywania poleceń powłoki
Wygraj :
Nix ( Lnx ( Ubtu )):
Dolna linia :
Uwagi końcowe :
źródło
glob.iglob
(iglob.glob
również) są oparteos.scandir
, więc teraz jest leniwy; aby uzyskać pierwsze trafienie w katalogu 10 mln plików, skanujesz tylko do momentu osiągnięcia pierwszego trafienia. A nawet w wersji wcześniejszej niż 3.6, jeśli używaszglob
metod bez symboli wieloznacznych, funkcja jest inteligentna: wie, że możesz mieć tylko jedno trafienie, więc upraszcza globowanie tylko doos.path.isdir
os.path.lexists
( lub w zależności od tego, czy ścieżka się kończy/
).os.path.isdir
lubos.path.lexist
ponieważ jest to zbiór wywołań i ciągów funkcji poziomu Pythona operacje, zanim zdecyduje, że efektywna ścieżka jest opłacalna, ale nie wymaga dodatkowego wywołania systemowego ani pracy we / wy, która jest o rząd wielkości wolniejsza).Jest to najprostszy sposób sprawdzenia, czy plik istnieje. Tylko dlatego, że plik istniał po sprawdzeniu, nie gwarantuje , że będzie tam, kiedy trzeba go otworzyć.
źródło
Python 3.4+ ma obiektowy moduł ścieżki: pathlib . Za pomocą tego nowego modułu możesz sprawdzić, czy plik istnieje w następujący sposób:
Możesz (i zwykle powinieneś) nadal używać
try/except
bloku podczas otwierania plików:Moduł pathlib zawiera wiele fajnych rzeczy: wygodne globowanie, sprawdzanie właściciela pliku, łatwiejsze dołączanie ścieżki itp. Warto to sprawdzić. Jeśli korzystasz ze starszego Pythona (wersja 2.6 lub nowsza), nadal możesz zainstalować pathlib za pomocą pip:
Następnie zaimportuj go w następujący sposób:
źródło
Wolę instrukcję try. Jest uważany za lepszy styl i pozwala uniknąć warunków wyścigowych.
Nie wierz mi na słowo. Istnieje mnóstwo poparcia dla tej teorii. Oto kilka:
źródło
try...except
tak nie pomaga rozwiązać tego problemu.except:
klauzuli sprawi, że wyjątek powstający w tej części kodu wywoła mylący komunikat (drugi błąd zgłoszony podczas przetwarzanie pierwszego.)Teraz dostępny od Pythona 3.4, importuj i tworzymy instancję
Path
obiektu o nazwie pliku, i sprawdźis_file
metodę (zauważ, że to zwraca True dla dowiązań symbolicznych wskazujących również na zwykłe pliki):Jeśli korzystasz z Python 2, możesz backportować moduł pathlib z pypi
pathlib2
lub w inny sposób sprawdzićisfile
zos.path
modułu:Teraz powyższe jest prawdopodobnie najlepszą pragmatyczną bezpośrednią odpowiedzią tutaj, ale istnieje możliwość wyścigu (w zależności od tego, co próbujesz osiągnąć) oraz fakt, że podstawowa implementacja używa
try
, ale Python używatry
wszędzie w swojej implementacji.Ponieważ Python używa
try
wszędzie, naprawdę 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 wersji Python 3.4, użyj nowego
Path
obiektu wpathlib
. Zauważ, że.exists
to nie do końca prawda, ponieważ katalogi nie są plikami (z wyjątkiem tego, że w Uniksie wszystko jest plikiem).Musimy więc użyć
is_file
:Oto pomoc dotycząca
is_file
:Pobierzmy więc plik, o którym wiemy, że to plik:
Domyślnie
NamedTemporaryFile
usuwa plik po zamknięciu (i zostanie automatycznie zamknięty, gdy nie będzie już więcej odwołań do niego).Jeśli jednak zagłębisz się w implementację , zobaczysz, że
is_file
używatry
:Warunki wyścigu: Dlaczego lubimy próbować
Lubimy to,
try
ponieważ pozwala uniknąć warunków wyścigowych. Dziękitry
po prostu próbujesz odczytać plik, oczekując, że on tam będzie, a jeśli nie, wychwytujesz wyjątek i wykonujesz dowolne zachowanie rezerwowe, które ma sens.Jeśli chcesz sprawdzić, czy plik istnieje, zanim spróbujesz go odczytać, być może usuwasz go, a następnie korzystasz z wielu wątków lub procesów lub inny program wie o tym pliku i może go usunąć - ryzykujesz wyścigu sprawdzając istnieje, bo są wtedy wyścigi , aby otworzyć go przed jego stanu (jego istnienie) zmienia.
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, to można uzyskać wartość
try
rachunku za pomocąsuppress
menedżera kontekstowe.Unikanie warunków wyścigu bez instrukcji try:
suppress
Python 3.4 udostępnia nam
suppress
menedżera kontekstu (wcześniejignore
menedżera kontekstu), który robi semantycznie dokładnie to samo w mniejszej liczbie wierszy, a jednocześnie (przynajmniej powierzchownie) spełnia oryginalne zapytanie o uniknięcietry
instrukcji:Stosowanie:
W przypadku wcześniejszych Pytonów możesz rzucić własne
suppress
, ale bez nichtry
będzie bardziej gadatliwy niż z. Wierzę, że tak naprawdę jest to jedyna odpowiedź, która nie jest używanatry
na żadnym poziomie w Pythonie, którą można zastosować przed Pythonem 3.4, ponieważ zamiast tego używa menedżera kontekstu:Być może łatwiejsze z próbą:
Inne opcje, które nie spełniają warunku „bez próby”:
plik is
z dokumentów :
Ale jeśli zbadasz źródło tej funkcji, zobaczysz, że faktycznie używa instrukcji try:
Wystarczy, że użyje podanej ścieżki, aby sprawdzić, czy może uzyskać statystyki, przechwytuje,
OSError
a następnie sprawdza, czy jest to plik, jeśli nie zgłosił wyjątku.Jeśli zamierzasz coś zrobić z plikiem, sugerowałbym bezpośrednią próbę spróbowania, z wyjątkiem uniknięcia wyścigu:
os.access
Dostępny jest dla systemów Unix i Windows
os.access
, ale aby go użyć, musisz przekazać flagi i nie rozróżnia on plików i katalogów. Jest to bardziej wykorzystywane do testowania, czy rzeczywisty wywołujący użytkownik ma dostęp w środowisku o podwyższonych uprawnieniach:Ma także takie same problemy z wyścigiem jak
isfile
. Z dokumentów :Unikaj używania
os.access
. Jest to funkcja niskiego poziomu, która ma więcej możliwości wystąpienia błędu użytkownika niż obiekty i funkcje wyższego poziomu omówione powyżej.Krytyka innej odpowiedzi:
Inna odpowiedź mówi o tym
os.access
:Ta odpowiedź mówi, że woli bez skłonności do Pythona, podatna na błędy, bez uzasadnienia. Wygląda na to, że zachęca użytkowników do korzystania z niskopoziomowych interfejsów API bez ich zrozumienia.
Tworzy również menedżera kontekstu, który poprzez bezwarunkowe zwracanie
True
pozwala wszystkim wyjątkom (w tymKeyboardInterrupt
iSystemExit
!) Przejść cicho, co jest dobrym sposobem na ukrycie błędów.Wydaje się, że zachęca to użytkowników do stosowania złych praktyk.
źródło
Importowanie
os
ułatwia nawigację i wykonywanie standardowych działań w systemie operacyjnym.W celach informacyjnych zobacz także Jak sprawdzić, czy plik istnieje za pomocą Pythona?
Jeśli potrzebujesz operacji na wysokim poziomie, użyj
shutil
.źródło
os.path.exists
zwraca true dla rzeczy, które nie są plikami, takich jak katalogi. To daje wyniki fałszywie pozytywne. Zobacz inne odpowiedzi, które zalecająos.path.isfile
.Testowanie plików i folderów z
os.path.isfile()
,os.path.isdir()
ios.path.exists()
Zakładając, że „ścieżka” jest prawidłową ścieżką, ta tabela pokazuje, co każda funkcja zwraca do plików i folderów:
Możesz również przetestować, czy plik jest określonego typu, używając go
os.path.splitext()
do uzyskania rozszerzenia (jeśli jeszcze go nie znasz)źródło
W 2016 roku najlepszym sposobem jest nadal
os.path.isfile
:Lub w Python 3 możesz użyć
pathlib
:źródło
pathlib
jest rozwiązaniem OOP dla ścieżek w Pythonie. Dzięki temu możesz zrobić znacznie więcej. Jeśli potrzebujesz tylko sprawdzić istnienie, przewaga nie jest tak duża.Nie wydaje się, aby istniała znacząca funkcjonalna różnica między try / wyjątkiem a
isfile()
, więc powinieneś użyć tego, który ma sens.Jeśli chcesz odczytać plik, jeśli istnieje, zrób to
Ale jeśli chcesz tylko zmienić nazwę pliku, jeśli istnieje, i dlatego nie musisz go otwierać, zrób to
Jeśli chcesz zapisać do pliku, jeśli nie istnieje, zrób to
Jeśli potrzebujesz blokowania plików, to inna sprawa.
źródło
os.path.exists
zwraca true dla rzeczy, które nie są plikami, takich jak katalogi. To daje wyniki fałszywie pozytywne. Zobacz inne odpowiedzi, które zalecająos.path.isfile
.filepath
odpowiednim czasie, a BAM zastępujesz plik docelowy. Powinieneś zrobićopen(filepath, 'wx')
wtry...except
bloku, aby uniknąć problemu.OSError
jeślifilepath + '.old'
już istnieje”: „W systemie Windows, jeśli dst już istnieje, 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. ”os.replace
przenośnie wykonuje cichą zamianę pliku docelowego (jest identyczny zos.rename
zachowaniem Linuxa) (błąd tylko wtedy, gdy istnieje nazwa docelowa i jest katalogiem). Więc utknąłeś na wersji 2.x, ale użytkownicy Py3 mają dobrą opcję od kilku lat.rename
przykładzie: należy to zrobić za pomocątry
/except
.os.rename
(lubos.replace
na współczesnym Pythonie) jest atomowy; sprawdzanie, a następnie zmiana nazwy wprowadza niepotrzebny wyścig i dodatkowe wywołania systemowe. Po prostu zróbtry: os.replace(filepath, filepath + '.old') except OSError: pass
Możesz spróbować (bezpieczniej):
Wyjście byłoby:
Następnie, w zależności od wyniku, twój program może po prostu dalej działać od tego miejsca lub możesz napisać kod, aby go zatrzymać, jeśli chcesz.
źródło
try
Chociaż zawsze polecam używanie
try
iexcept
oświadczenia, oto kilka możliwości dla ciebie (mój osobisty faworyt używaos.access
):Spróbuj otworzyć plik:
Otwarcie pliku zawsze weryfikuje jego istnienie. Możesz zrobić taką funkcję:
Jeśli ma wartość False, przestanie działać z nieobsługiwanym IOError lub OSError w późniejszych wersjach Pythona. Aby złapać wyjątek, musisz użyć klauzuli try oprócz. Oczywiście zawsze możesz użyć
try
instrukcji wyjątku w ten sposób (dzięki hsandt za zmuszenie mnie do myślenia):Użyj
os.path.exists(path)
:Spowoduje to sprawdzenie istnienia tego, co określisz. Sprawdza jednak pliki i katalogi, więc uważaj na to, jak z nich korzystasz.
Użyj
os.access(path, mode)
:Spowoduje to sprawdzenie, czy masz dostęp do pliku. Sprawdzi uprawnienia. W oparciu o dokumentację os.py, wpisując
os.F_OK
, sprawdzi istnienie ścieżki. Jednak użycie tego spowoduje powstanie luki w zabezpieczeniach, ponieważ ktoś może zaatakować twój plik, wykorzystując czas między sprawdzeniem uprawnień a otwarciem pliku. Zamiast tego powinieneś przejść bezpośrednio do otwierania pliku zamiast sprawdzania jego uprawnień. ( EAFP vs LBYP ). Jeśli nie zamierzasz później otwierać pliku i sprawdzasz tylko jego istnienie, możesz tego użyć.W każdym razie tutaj:
Powinienem także wspomnieć, że istnieją dwa sposoby, aby nie można było zweryfikować istnienia pliku. Albo będzie to problem,
permission denied
albono such file or directory
. Jeśli złapieszIOError
, ustawIOError as e
(jak moja pierwsza opcja), a następnie wpisz,print(e.args)
aby, miejmy nadzieję, ustalić problem. Mam nadzieję, że to pomoże! :)źródło
Data: 04.12.2017
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:
Zrobiłem wyczerpującą ściągę dla twojego odniesienia:
źródło
Jeśli plik jest przeznaczony do otwarcia, możesz użyć jednej z następujących technik:
AKTUALIZACJA
Aby uniknąć nieporozumień i na podstawie otrzymanych odpowiedzi, bieżąca odpowiedź znajduje plik lub katalog o podanej nazwie.
źródło
os.path.exists
zwraca true dla rzeczy, które nie są plikami, takich jak katalogi. To daje wyniki fałszywie pozytywne. Zobacz inne odpowiedzi, które zalecająos.path.isfile
.Dodatkowo
os.access()
:Będąc
R_OK
,W_OK
iX_OK
flagi do testowania uprawnień ( doc ).źródło
SRC: http://www.pfinn.net/python-check-if-file-exists.html
źródło
Jeśli importowane NumPy już do innych celów, to nie ma potrzeby, aby importować innych bibliotek, takich jak
pathlib
,os
,paths
, itd.Zwróci wartość prawda lub fałsz na podstawie jego istnienia.
źródło
Możesz napisać sugestię Briana bez
try:
.suppress
jest częścią Python 3.4. W starszych wersjach możesz szybko napisać własne pomijanie:źródło
Jestem autorem pakietu, który istnieje około 10 lat i ma funkcję, która bezpośrednio rozwiązuje to pytanie. Zasadniczo, jeśli korzystasz z systemu innego niż Windows, używa
Popen
dostępufind
. Jeśli jednak korzystasz z systemu Windows, replikuje sięfind
za pomocą wydajnego systemu plików.Sam kod nie używa
try
bloku… z wyjątkiem określania systemu operacyjnego i kierowania do stylu „Unix”find
lub ręcznego builltafind
. Testy czasowe wykazały, żetry
szybsze było określanie systemu operacyjnego, więc użyłem jednego z nich (ale nigdzie indziej).A dokument…
Wdrożenie, jeśli chcesz wyglądać, jest tutaj: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190
źródło
Sprawdź plik lub katalog istnieje
Możesz postępować zgodnie z tymi trzema sposobami:
źródło
Dodanie jeszcze jednej niewielkiej zmiany, która nie jest dokładnie odzwierciedlona w innych odpowiedziach.
Zajmie się to przypadkiem
file_path
istnieniaNone
lub pustym ciągiem.Dodanie wariantu na podstawie sugestii Shahbaz
Dodanie wariantu na podstawie sugestii Petera Wooda
źródło
if (x) return true; else return false;
jest naprawdę sprawiedliwyreturn x
. Twoje cztery ostatnie linie mogą się staćreturn os.path.isfile(file_path)
. Skoro już o tym mowa, całą funkcję można uprościć jakoreturn file_path and os.path.isfile(file_path)
.return x
w przypadkuif (x)
. Python rozważy pusty ciąg Fałsz, w którym to przypadku zwracalibyśmy pusty ciąg zamiast bool. Celem tej funkcji jest zawsze zwracanie wartości bool.x
jestos.path.isfile(..)
tak, że już bool.os.path.isfile(None)
podnosi wyjątek, dlatego dodałem czek if. Prawdopodobnie mógłbym to po prostu zawinąć w try / oprócz, ale czułem, że w ten sposób było to bardziej wyraźne.return file_path and os.path.isfile(file_path)
Oto jedno wierszowe polecenie Python dla środowiska wiersza poleceń Linux. Uważam to za BARDZO HANDY, ponieważ nie jestem tak gorącym facetem Bash.
Mam nadzieję, że to jest pomocne.
źródło
[ -f "${file}" ] && echo "file found" || echo "file not found"
(to samo coif [ ... ]; then ...; else ...; fi
).Możesz użyć biblioteki „OS” Pythona:
źródło
os.path.exists
zwraca true dla rzeczy, które nie są plikami, takich jak katalogi. To daje wyniki fałszywie pozytywne. Zobacz inne odpowiedzi, które zalecająos.path.isfile
.exists
jest w porządku. Jeśli celem jest ustalenie, czy bezpiecznie można otworzyć prawdopodobnie istniejący plik, 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).W 2016 r. Jest to prawdopodobnie najłatwiejszy sposób sprawdzenia, czy plik istnieje i czy jest to plik:
isfile
jest właściwie tylko metodą pomocniczą, która jest wewnętrznie używanaos.stat
istat.S_ISREG(mode)
znajduje się pod spodem. Jestos.stat
to metoda niższego poziomu, która zapewni szczegółowe informacje o plikach, katalogach, gniazdach, buforach i innych. Więcej o os.stat tutajUwaga: jednak to podejście nie blokuje pliku w żaden sposób, dlatego kod może stać się podatny na błędy związane z „ czasem sprawdzenia do czasu użycia ” ( TOCTTOU ).
Dlatego zgłaszanie wyjątków jest uważane za akceptowalne i Pythoniczne podejście do kontroli przepływu w twoim programie. I należy rozważyć obsługę brakujących plików za pomocą IOErrors, a nie
if
instrukcji ( tylko rada ).źródło
źródło
isReadableFile(path,fileName)
zwróci,True
jeśli plik jest osiągalny i możliwy do odczytu przez proces \ program \ wątek