Istisnasız bir fayl var olub olmadığını necə yoxlamaq olar?

Bir faylın bir sınaq try istifadə etmədən və ya olmasından necə xəbərim var?

4683
17 сент. spence91 set 17 sep . 2008-09-17 15:55 '08 saat 15:55 'də 2008-09-17 15:55' də
@ 47 cavab
  • 1
  • 2

Test etdiyiniz səbəbdir, çünki if file_exists: open_it() kimi bir şey edə bilərsiniz if file_exists: open_it() , onu açmağa çalışırken istifadə etmək daha təhlükəsizdir. Doğrulama və sonrakı açılış faylın silinməsi və ya hərəkəti ilə yanaşı yoxlanacağınıza və onu açmağa çalışdığınız zaman gətirə bilər.

Faylı dərhal açmağı planlaşdırmırsanız, os.path.isfile istifadə edə bilərsiniz

Yolun mövcud bir müntəzəm fayl olduğu təqdirdə Geri True . Bu simvolik əlaqələri izləyir, belə ki, həm islink , həm də isfile () eyni yol üçün doğrudur.

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

bu bir fayl olduğundan əmin olmalısan.

Python 3.4-də başlayaraq, pathlib modul obyekt yönümlü bir yanaşma (Python 2.7-də pathlib2 -də pathlib2 ) təklif edir:

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

Dizini yoxlamaq üçün, işləyin:

 if my_file.is_dir(): # directory exists 

Path obyektinin bir fayl və ya qovluğdan asılı olmayaraq mövcud olub olmadığını yoxlamaq üçün, istifadə edin exists() :

 if my_file.exists(): # path exists 

Siz də try blokunda resolve(strict=True) istifadə edə bilərsiniz:

 try: my_abs_path = my_file.resolve(strict=True) except FileNotFoundError: # doesn't exist else: # exists 
4266
17 сент. cavab verildi rslite 17 sep . 2008-09-17 15:57 '08 at 15:57 2008-09-17 15:57

os.path.exists funksiyanız var:

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

Bu fayllar və qovluqlar üçün doğru gəlir, amma əvəzinə istifadə edə bilərsiniz

border=0
 os.path.isfile(file_path) 

bu bir fayl olub olmadığını yoxlamaq üçün. Simvolik əlaqələri izləyir.

1820
17 сент. Cavab 17 sentyabrda PierreBdR tərəfindən verilmişdir . 2008-09-17 15:57 '08 at 15:57 2008-09-17 15:57

isfile() dan fərqli olaraq, exists() kataloqlar üçün True olacaq.
Buna görə, yalnız müntəzəm faylları və ya kataloqlardan istifadə etmək istəməyinizə bağlı olaraq, isfile() və ya exists() . Burada sadə bir REPL çıxışı var.

 >>> 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 
858
17 сент. Cavab bortzmeyer tərəfindən verilir 17 sep . 2008-09-17 18:01 '08 at 6:01 pm 2008-09-17 18:01
 import os.path if os.path.isfile(filepath): 
517
17 сент. Cavab Paul 17 sep verilir . 2008-09-17 15:55 '08 saat 15:55 'də 2008-09-17 15:55' də

os.path.isfile() ilə os.access() istifadə edin:

 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" 
263
16 янв. Cavab Yuqal Jindle 16 yanvar verilir 2012-01-16 08:57 '12 at 8:57 2012-01-16 08:57
 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 
233
17 сент. Cavab verilir 17 sentyabr. 2008-09-17 15:56 '08 saat 15:56 'de 2008-09-17 15:56

Mövcud cavablar (məsələn Python 3.4 üçün xüsusi material əlavə edildi) demək olar ki, bütün mümkün yolları (ən azı biri) siyahıya alınmasına baxmayaraq, hər şeyi bir araya toplayacağam.

Qeyd : Mən dərc edəcəyəm standart Python kitabxanasının hər bir kod parçası 3.5.3 versiyasına aiddir.

Problem problemi :

  1. Fayl mövcudluğunu yoxlayın (mübahisəli: ayrıca qovluq ("xüsusi" fayl)?)
  2. Try / exception / else / nəhayət blokları istifadə etməyin

Mümkün həllər :

  1. [Python 3]: os.path. Var (yol) (həmçinin bir az fərqli davranış üçün os.path.isfile , os.path.isdir , os.path.lexists kimi funksiyalar ailəsinin digər üzvlərini yoxlayın)

    os.stat () icra etməyə icazə verilmədikdə, bu funksiyanı False edə bilər. 

    Hər şey yaxşıdır, ancaq idxal ağacını təqib edirsən:

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

      • genericpath.py, satır ~ # 20 +

        [Python 3] ətrafında yalnız bir cəhd / istisna blokudur : os.  stat (yol, *, dir_fd = no, follow_symlinks = True) .  Beləliklə, kodunuzu cəhd edin , istisna olmaqla, pulsuz, lakin aşağıda (ən azı) bir blokun yığınına daxil edin.  Bu da digər funksiyalara aiddir ( os.path.isfile daxil olmaqla ). 

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

        • Bu yolları idarə etmək üçün daha zərif (və daha pythonic) bir yol
        • Başlıq altında eyni şeyi edir (pathlib.py, line # 1330):

        • [Python 3] istifadə edin : contextlib. (* istisnalar) - istisnaları seçici şəkildə bastırmaq üçün nəzərdə tutulmuşdur


        Amma onlar Python 3 kimi cəhd / exclude / else / nəhayət blokları üzərində sarmalçı kimi görünürlər:

        Bu, adi cəhdləri əhatə etmə imkanı verir ... nəhayət, rahat istifadə üçün nümunələri istifadə edin.

      • Fayl sisteminin keçiş funksiyaları (və elementləri uyğun nəticələri ilə axtarış)


        Qovluqlardan baxdıqları üçün (əksər hallarda) onlar bizim problemimiz üçün təsirsizdirlər (@ShadowRanger tərəfindən qeyd edildiyi kimi, qəhrəmanlıq olmadan qloballaşma kimi istisnalar mövcuddur), buna görə də onlara təkid verməyəcəyəm. Bəzi hallarda fayl adını idarə etmək lazım ola bilər.

      • [Python 3]: os. davranışı os.path.exists a os.path.exists (əslində, əsasən, 2-ci sübuta görə daha genişdir ) , giriş (yol, rejimi, *, dir_fd = heç, effektiv_id = false, follow_symlinks = TRUE )

        • İstifadəçi icazələri sənəddə göstərildiyi kimi, faylın "görünürlüğünü" məhdudlaşdıra bilər:

          ... zəng edənin müəyyən edilmiş yola çıxışı olub olmadığını yoxlayın. bir yolun varlığını yoxlamaq üçün rejimi F_OK olmalıdır ...

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

        Mən də C-də işlədiyim üçün də bu metoddan istifadə edirəm, çünki içərisində öz API-lərini çağırır (yenidən "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c" vasitəsilə), lakin mümkün olan istifadəçi səhvləri üçün də açılır , digər variant kimi Pythonic kimi deyil. Beləliklə, @AaronHall düzgün qeyd etdiyimiz kimi, nə etdiyinizi bilmirsinizsə, istifadə etməyin:

        Qeyd : doğuş API'larını çağırmaq da [Python 3] vasitəsilə mümkündür : ctypes Python üçün üçüncü tərəf funksiyalarının bir kitabxanasıdır , lakin əksər hallarda bu daha mürəkkəbdir.

        ( Win üçün asılıdır): vcruntime * (msvcr *). Dll də ixrac [MS.Docs]: _access, _waccess funksiyaları ailəsi, burada bir nümunə:

         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"/tmp1", os.F_OK) -1 

        Qeydlər :

        • Sistemlər arasında fərqlənə biləcək (və ən çox güman ki) "libc" yolu ("/lib/x86_64-linux-gnu/libc.so.6") sabit kodlaşdırmaq əvəzinə, heç bir (və ya boş simli) ctypes.CDLL(None).access(b"/tmp", os.F_OK) konstruktoruna ctypes.CDLL(None).access(b"/tmp", os.F_OK) bilər ctypes.CDLL(None).access(b"/tmp", os.F_OK) ( ctypes.CDLL(None).access(b"/tmp", os.F_OK) ). [Man7] görə: DLOPEN (3) :

          Fayl adı NULLysa, geri qaytarılmış sapı əsas proqram üçündür. Dlsym () funksiyası müəyyən edildikdə, bu təsvir əsas proqramda bir simvol axtarışına, sonra proqramı başlatdıqda yüklənən bütün ümumi obyektlərə, sonra da dlopen () ilə yüklənən bütün ümumi obyektlərə RTLD_GLOBAL bayraq ilə axtarış aparır .

          • Əsas (cari) proqram (python) libc ilə əlaqəli, onun simvolları (daxil olmaqla) yüklənəcəkdir
          • Bu, əsas kimi, Py_Main və (digərləri) funksiyaları mövcud olduğundan, diqqətlə istifadə olunmalıdır; onların çağırışı fəlakətli ola bilər (mövcud proqram üçün)
          • Bu da Win üçün tətbiq edilmir (məsələn, msvcrt.dll "% SystemRoot% \ System32" içindədir, çünki bu, məsələn,% PATH%). ( MS.Docs): GetProcAddress funksiyası yalnız ixrac olunan simvolları "görür", belə ki, kimsə əsas yürütüle bilən faylda funksiyanı bildirməyincə, getmək və Win-də bu davranışı təkrarlamaq istəyirdi (və patch göndərin) __declspec(dllexport) (niyə sadə bir insanın Yer üzündə bunu edərdi?), əsas proqram yüklənə bilər, lakin istifadə üçün əsasən yararsızdır
      • Fayl sisteminin imkanları ilə bəzi üçüncü tərəf modulları quraşdırın

        Çox güman ki, yuxarıda göstərilən metodlardan birinə (ehtimal ki, kiçik parametrlər) əsaslanır.
        Bir nümunə (yenidən, Win-spesifikasiya) olacaqdır: [GitHub]: mhammond / pywin32 - WINAPI üçün Python sarmalayıcı olan Windows üçün Python uzantıları (pywin32) .

        Lakin, bu daha çox bir həll yolu olduğundan, buradayam.

      • Digər (zəif) həll yolu (eararie) sysadmin yanaşmasıdır: Python'u shell əmrlərini yerinə yetirmək üçün istifadə etmək

        • Win:

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

Nəticə :

  • Bəzi qeyri- adi problemlərə başlamağa mane ola biləcəkləri üçün / başqa / nəhayət blokları istisna etməliyik. Düşündüyüm əks-nümunə məhsuldarlıqdır: bu cür bloklar bahalıdır, belə ki, onları koduna qoymağı xahiş edirəm ki, onu saniyədə yüz minlərlə dəfə yerinə yetirmək lazımdır (lakin əksər hallarda disk daxilinə daxildir) belə olmayacaq).

Yekun Qeyd (lər) :

  • Mən bunu gündəmə gətirməyə çalışacağam, hər hansı bir təklifi qəbul edərəm, cavab verən hər şeyi faydalı hesab edəcəyəm
166
20 июня '17 в 22:28 2017-06-20 22:28 Cavab CristiFati tərəfindən 20 İyun '17 'də 10:28 2017-06-20 22:28' də verilir

Bir faylın mövcud olub olmadığını yoxlamaq üçün bu asan bir yoldur. Sən yoxladığınız zaman mövcud olan fayl onu açmaq üçün orada olacağına zəmanət vermir .

 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") 
143
27 июня '13 в 16:38 2013-06-27 16:38 cavab 27 iyun 'da saat 16:38' da veriləcək

Python 3.4+ obyekt yönümlü bir yola malikdir: pathlib . Bu yeni modul istifadə edərək, faylın aşağıdakı olub olmadığını yoxlaya bilərsiniz:

 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 

Faylları açarkən bir try/except blok istifadə edə bilərsiniz (və adətən olmalıdır):

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

Platib modulda çox gözəl şeylər var: rahat yumşaqlıq, fayl sahibinin yoxlanılması, sadələşdirilməsi və s. Çıxarmaq lazımdır. Köhnə bir Python istifadə edirsinizsə (versiya 2.6 və ya daha sonrakı), siz də platıla platıfı yükləyə bilərsiniz:

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

Sonra bunu aşağıdakı kimi idxal edin:

 # Older Python versions import pathlib2 as pathlib 
127
08 февр. Cody Piersall tərəfindən verilmiş cavab 08 fevral. 2014-02-08 05:38 '14 da 5:38 2014-02-08 05:38

Operatoru cəhd edin. O, ən yaxşı üslub hesab edilir və yarış şərtlərini aradan qaldırır.

Bunun üçün sözümü götürməyin. Bu nəzəriyyəyə bir çox dəstək var. Bir neçə var:

113
04 нояб. Cavab verilir pkoch 04 Nov. 2009-11-04 03:48 '09 at 3:48 2009-11-04 03:48

Python istifadə edərək, bir faylın bir sınaq ifadəsini istifadə etmədən yoxluğunu yoxlamaq üçün necə?

İndi, Python 3.4 ilə başlayaraq, faylın adı ilə Path obyektinin bir nümunəsini idxal et və yaradın və is_file metodunu yoxlayın (simvolik əlaqələr üçün müntəzəm faylları göstərən True qaytarır).

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

Python 2-də olduğunuzda pathlib modulu pathlib2 , pathlib2 dən geri ala bilərsiniz və ya os.path modulunda başqa isfile yoxlaya isfile :

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

Yuxarıda yəqin ki, burada ən yaxşı pragmatik birbaşa cavabdır, amma yarışın vəziyyəti (yerinə yetirməyə çalışdığınıza bağlı olaraq) və əsas tətbiqin istifadə etdiyinin gerçəkliyi var, amma Python istifadə etdiyi hər yerdə tətbiq edir.

Python hər yerdə istifadə etdiyinə görə istifadə edən tətbiqdən qaçınmaq üçün heç bir səbəb yoxdur.

Lakin bu cavabın qalan hissəsi bu şərtləri nəzərə almağa çalışır.

Daha uzun, daha çox pedantik cavab

Python 3.4 'dən mövcuddur, yeni Path obyektini pathlib . Qeyd edək ki, .exists fayllar deyildir (unix istisna olmaqla, hamısı bir fayldır).

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

Beləliklə, is_file istifadə etmək lazımdır:

 >>> root.is_file() False 

is_file haqqında is_file :

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

Budur, bildiyimiz fayl fayl olaraq olsun:

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

NamedTemporaryFile olaraq, NamedTemporaryFile fayl qapalı olduğunda faylları NamedTemporaryFile (və avtomatik olaraq bağlanmazsa avtomatik olaraq bağlanır).

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

is_file həyata keçirilməsini is_file , is_file istifadə etdiyini is_file :

 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 

Yarış şərtləri: niyə imtahan etmək istəyirik?

Yarış şərtlərindən qaçındıqca, try etmək istəyirik. Denemeyi istifadə edərək try sadəcə olaraq faylınızı oxumağa çalışın və orada olmağı gözləyin və əgər istisna etsəniz, ehtimal olunan bütün ehtiyat tədbirlərini yerinə yetirəcəksiniz.

Bir faylın oxumağa çalışmasından əvvəl mövcud olub olmadığını yoxlamaq və onu silə bilərsiniz və sonra bir neçə mövzu və ya prosesdən istifadə edə bilərsiniz və ya başqa bir proqram bu fayl haqqında bilir və onu silə bilər - yoxlayarsanız bir yarış şərtinin riski ona görə də onun dövlətinin (mövcudluğunun) əvvəlində onu açmaq üçün tələsirsiniz.

Yarış şərtləri diskussiya etmək üçün çox çətindir, çünki proqramı çökə biləcək çox kiçik bir pəncərə var.

Lakin bu sizin motivasiyanız, kontekst menecerini suppress try təlimatının dəyərini əldə edə bilərsiniz.

Tərəfsiz yarış şərtlərini çəkinin: talimatları basdırın

Python 3.4 bizə try təlimatından qaçınmaq üçün bizə səmərəli olaraq daha az xəttdə eyni şeyi və ayrıca (ən azı səthi şəkildə), orijinal sorğunu təmin edən kontekst meneceri (daha əvvəl kontekst meneceri ignore alınmadı) verir:

 from contextlib import suppress from pathlib import Path 

İstifadə edin:

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

Daha əvvəl Python üçün, öz suppress tersine çevirə bilərsiniz, ancaq try etmədən, daha çox detallı olacaq. Python 3.4-dən əvvəl tətbiq oluna bilən Python-da heç bir səviyyədə istifadə etməyən yeganə cavabdır , çünki bunun əvəzinə bir kontekst meneceri istifadə edir:

 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) 

Təcrübə daha asan ola bilər:

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

"Xeyr" cəhdinə uyğun olmayan digər variantlar:

ISFILE

 import os os.path.isfile(path) 

Sənədlərdən :

os.path.isfile(path)

Yolun mövcud bir müntəzəm fayl olduğu təqdirdə True qaytarır. Bu, simvolik bir linkdən ibarətdir, belə ki, həm islink()isfile() parametrləri həmin yol üçün doğrudur.

Ancaq bu funksiyanın qaynağını araşdırdığınızda, həqiqətən, test ifadəsini istifadə etdiyini görürsünüz:

 # 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 

O, bütün OSError tutaraq onu statistika ala OSError və sonra bir istisna OSError bir fayl olmadığını yoxlamaq üçün müəyyən bir yoldan istifadə edir.

Fayl ilə bir şey etmək niyyətindəsinizsə, irqi vəziyyətdən qaçınmaq üçün birbaşa cəhdlə çalışırsınız:

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

os.access

Unix və Windows os.access üçün istifadə edilə bilər, lakin istifadə etmək üçün bayraqları keçməlisiniz və faylları və qovluqları os.access . Bu, real zəngçinin üstün imtiyazlara sahib bir mühitdə olub-olmadığını yoxlamaq üçün daha çox istifadə olunur:

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

O, isfile kimi yarış şərtləri ilə eyni problemlərdən də isfile . Sənədlərdən :

Qeyd: İstifadəçinin icazə verdiyini yoxlamaq üçün istifadə () istifadə edin. открыть файл перед тем как это сделать, используя open(), создает дыру в безопасности, потому что пользователь может использовать короткий промежуток времени между проверкой и открыв файл, чтобы манипулировать им. Его предпочтительнее использовать EAFP методы. Məsələn:

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

лучше писать как:

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

Избегайте использования os.access . Это функция низкого уровня, которая имеет больше возможностей для пользовательской ошибки, чем объекты и функции более высокого уровня, рассмотренные выше.

Критика другого ответа:

Другой ответ говорит об этом os.access :

Лично я предпочитаю это, потому что под капотом он вызывает собственные API (через "$ {PYTHON_SRC_DIR}/Modules/posixmodule.c" ), но он также открывает ворота для возможных пользовательских ошибок, и это не как Pythonic как другие варианты:

В этом ответе говорится, что он предпочитает непитонический, подверженный ошибкам метод, без каких-либо оснований. Похоже, пользователи поощряют использование низкоуровневых API без их понимания.

Он также создает менеджер контекста, который, безоговорочно возвращающий True , позволяет обойти все Исключения (включая KeyboardInterrupt и SystemExit !)), что является хорошим способом скрыть ошибки.

Это, по-видимому, побуждает пользователей принимать плохие практики.

107
ответ дан Aaron Hall 11 авг. '15 в 6:54 2015-08-11 06:54
 import os #Your path here eg "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!" 

Импорт os упрощает навигацию и выполнение стандартных действий с вашей операционной системой.

Для справки также см. Как проверить, существует ли файл с использованием Python?

Если вам нужны операции высокого уровня, используйте shutil .

81
ответ дан Bishop 25 мая '15 в 21:29 2015-05-25 21:29

Тестирование файлов и папок с помощью os.path.isfile() , os.path.isdir() и os.path.exists()

Предполагая, что "путь" является допустимым путем, в этой таблице показано, что возвращается каждой функцией для файлов и папок:

2019

ответ дан Tom Fuller 08 окт. '16 в 15:43 2016-10-08 15:43

В 2016 году лучший способ все еще использует os.path.isfile :

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

Или в Python 3 вы можете использовать pathlib :

 import pathlib path = pathlib.Path('/path/to/some/file.txt') if path.is_file(): ... 
65
ответ дан KaiBuxe 24 февр. '16 в 15:44 2016-02-24 15:44

Кажется, что нет смысла в функциональной разнице между try/except и isfile() , поэтому вы должны использовать тот, который имеет смысл.

Если вы хотите прочитать файл, если он существует, выполните

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

Но если вы просто хотели переименовать файл, если он существует, и поэтому его не нужно открывать, выполните

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

Если вы хотите записать файл, если он не существует, выполните

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

Если вам нужна блокировка файлов, это другое дело.

59
ответ дан chad 25 сент. '13 в 4:52 2013-09-25 04:52

Вы можете попробовать это (безопаснее):

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

Вывод будет:

([Errno 2] Нет такого файла или каталога: 'Whatever.txt')

Затем, в зависимости от результата, ваша программа может просто продолжать работать оттуда или вы можете закодировать ее, если хотите.

52
ответ дан philberndt 26 янв. '11 в 2:00 2011-01-26 02:00

Хотя я всегда рекомендую использовать инструкции try и except , вот несколько возможностей для вас (мой личный фаворит использует os.access ):

  • Попробуйте открыть файл:

    Открытие файла всегда проверяет наличие файла. Вы можете сделать функцию так:

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

    Если он False, он прекратит выполнение с неподготовленным IOError или OSError в более поздних версиях Python. Чтобы поймать исключение, вы должны использовать предложение try except. Конечно, вы всегда можете используйте оператор try except`, подобный этому (благодаря hsandt за то, что я думаю):

     def File_Existence(filepath): try: f = open(filepath) except IOError, OSError: # Note OSError is for later versions of Python return False return True 
  • Используйте os.path.exists(path) :

    Это проверит наличие того, что вы укажете. Тем не менее, он проверяет файлы и каталоги, поэтому остерегайтесь того, как вы его используете.

     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 
  • Используйте os.access(path, mode) :

    Это проверит, есть ли у вас доступ к файлу. Он будет проверять разрешения. На основе документации os.py, набрав os.F_OK , он проверяет существование пути. Тем не менее, использование этого приведет к созданию дыры в безопасности, так как кто-то может атаковать ваш файл, используя время между проверкой разрешений и открытием файла. Вместо этого вы должны перейти непосредственно к открытию файла, а не проверять его разрешения. ( EAFP vs LBYP ). Если вы не собираетесь открывать файл после этого и проверяете его существование, вы можете использовать его.

    В любом случае, здесь:

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

Я также должен упомянуть, что есть два способа, которыми вы не сможете проверить наличие файла. Либо проблема будет permission denied , либо no such file or directory . Если вы поймаете IOError , установите IOError as e (как и мой первый вариант), а затем введите print(e.args) , чтобы вы могли, надеюсь, определить вашу проблему. Я надеюсь, что это помогает!:)

47
ответ дан Zizouz212 26 дек. '14 в 23:05 2014-12-26 23:05

В Python 3.4 язык предоставляет новый модуль для управления файлами:

 import pathlib path = pathlib.Path('path/to/file') if path.is_file(): # If you want to check a directory: path.is_dir() # If it is true, return true on your code. 
34
ответ дан Unai Sainz de la Maza 06 нояб. '15 в 0:15 2015-11-06 00:15

Кроме того, os.access() :

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

Быть R_OK , W_OK и X_OK флаги для проверки разрешений ( doc ).

32
ответ дан zgoda 17 сент. '08 в 16:13 2008-09-17 16:13

Если файл открыт, вы можете использовать один из следующих способов:

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

ОБНОВИТЬ

Чтобы избежать путаницы и на основании полученных @, текущий ответ находит либо файл, либо каталог с заданным именем.

31
ответ дан bergercookie 13 окт. '14 в 10:45 2014-10-13 10:45
 if os.path.isfile(path_to_file): try: open(path_to_file) pass except IOError as e: print "Unable to open file" 

Принятие исключений считается приемлемым, а Pythonic, подход к управлению потоком в вашей программе. Рассмотрите возможность обработки отсутствующих файлы с IOErrors. В этой ситуации исключение IOError будет если файл существует, но пользователь не имеет прав на чтение.

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

21
ответ дан Pedro Lobito 28 апр. '15 в 5:45 2015-04-28 05:45

Просто чтобы добавить к путанице, кажется, что предложенный ранее метод try: open() не работает в Python, поскольку доступ к файлам не является исключительным, даже при записи в файлы, cf Каков наилучший способ открыть файл для эксклюзивного доступа в Python? .

19
ответ дан Tilman 22 нояб. '10 в 19:19 2010-11-22 19:19

Вы можете написать предложение Брайана без try: .

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

suppress является частью Python 3.4. В старых версиях вы можете быстро написать свое собственное подавление:

 from contextlib import contextmanager @contextmanager def suppress(*exceptions): try: yield except exceptions: pass 
17
ответ дан Chris 11 февр. '14 в 0:30 2014-02-11 00:30

Если вы импортировали NumPy уже для других целей, нет необходимости импортировать другие библиотеки, такие как pathlib , os , paths и т.д.

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

Это вернет true или false, основываясь на его существовании.

17
ответ дан durjoy 10 авг. '17 в 8:50 2017-08-10 08:50

Проверить файл или каталог

Вы можете выполнить следующие три способа:

Примечание1: os.path.isfile используется только для файлов

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

Примечание2: os.path.exists используется как для файлов, так и для каталогов

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

Метод pathlib.Path (включен в Python 3+, устанавливается с помощью пипа для Python 2)

 from pathlib import Path Path(filename).exists() 
16
ответ дан Ali Hallaji 04 марта '18 в 9:24 2018-03-04 09:24

Я являюсь автором пакета, который существует около 10 лет, и у него есть функция, которая напрямую решает этот вопрос. В принципе, если вы находитесь в системе, отличной от Windows, она использует Popen для доступа к find . Однако, если вы находитесь в Windows, он реплицирует find эффективным ходоком файловой системы.

В самом коде не используется блок try ... кроме определения операционной системы и, таким образом, управление вами в стиле "Unix" find или ручном built find . Временные тесты показали, что try был быстрее при определении ОС, поэтому я использовал его там (но нигде больше).

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

И документ...

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

Реализация, если вы хотите посмотреть, находится здесь: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190

15
ответ дан Mike McKerns 05 мая '16 в 15:00 2016-05-05 15:00

Добавление еще одной небольшой вариации, которая не совсем отражена в других ответах.

Это будет обрабатывать случай file_path , являющийся None или пустой строкой.

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

Добавление варианта, основанного на предположении от Шахбаза

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

Добавление варианта, основанного на предположении от Питера Вуда

 def file_exists(file_path): return file_path and os.path.isfile(file_path): 
15
ответ дан Marcel Wilson 05 авг. '16 в 18:54 2016-08-05 18:54

Здесь приведена 1 строка команды Python для среды командной строки Linux. Я нахожу это ОЧЕНЬ HANDY, так как я не такой горячий парень Bash.

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

Я надеюсь, что это будет полезно.

15
ответ дан Love and peace - Joe Codeswell 29 авг. '15 в 19:15 2015-08-29 19:15

Дата: 2017-12-04

Все возможные решения перечислены в других ответах.

Интуитивно понятный и аргументированный способ проверить, существует ли файл:

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

Я сделал исчерпывающий чарт для вашей справки:

 #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']} 
13
ответ дан JawSaw 04 дек. '17 в 11:51 2017-12-04 11:51

Как проверить, существует ли файл, без использования инструкции try?

В 2016 году это, по-прежнему, самый простой способ проверить, существует ли файл и есть ли он файл:

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

isfile на самом деле просто вспомогательный метод, который внутри использует os.stat и stat.S_ISREG(mode) внизу. Этот os.stat - это метод более низкого уровня, который предоставит вам подробную информацию о файлах, каталогах, сокетах, буферах и т.д. Подробнее о os.stat здесь

Qeyd Однако этот подход не будет блокировать файл каким-либо образом, поэтому ваш код может стать уязвимым для ошибок " время проверки на время использования " (TOCTTOU).

Таким образом, создание исключений считается приемлемым и Pythonic-подходом для управления потоком в вашей программе. И следует рассмотреть вопрос обработки недостающие файлы с IOErrors, а не if заявления (просто совет).

12
ответ дан Inconnu 02 дек. '16 в 9:39 2016-12-02 09:39
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос