Bagaimana cara memeriksa apakah file ada tanpa pengecualian?

Jawaban:

5153

Jika alasan Anda mengecek adalah agar Anda dapat melakukan sesuatu seperti if file_exists: open_it(), lebih aman menggunakan upaya trysekitar untuk membukanya. Memeriksa dan kemudian membuka risiko file dihapus atau dipindahkan atau ada sesuatu antara ketika Anda memeriksa dan ketika Anda mencoba untuk membukanya.

Jika Anda tidak berencana untuk segera membuka file, Anda dapat menggunakannya os.path.isfile

Kembali Truejika path adalah file biasa yang sudah ada. Ini mengikuti tautan simbolik, sehingga islink () dan isfile () bisa benar untuk jalur yang sama.

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

jika Anda perlu memastikan itu adalah file.

Dimulai dengan Python 3.4, pathlibmodul ini menawarkan pendekatan berorientasi objek (backported ke pathlib2dalam Python 2.7):

from pathlib import Path

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

Untuk memeriksa direktori, lakukan:

if my_file.is_dir():
    # directory exists

Untuk memeriksa apakah suatu Pathobjek ada secara independen dari apakah itu file atau direktori, gunakan exists():

if my_file.exists():
    # path exists

Anda juga dapat menggunakan resolve(strict=True)di tryblok:

try:
    my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
    # doesn't exist
else:
    # exists
rslite
sumber
40
mengenai komentar pertama (gunakan "coba" jika periksa sebelum membuka) sayangnya ini tidak akan berfungsi jika Anda ingin membuka untuk menambahkan yakin itu ada sebelum karena mode 'a' akan dibuat jika tidak ada.
makapuf
6
Catatan yang FileNotFoundErrordiperkenalkan di Python 3. Jika Anda juga perlu mendukung Python 2.7 dan juga Python 3, Anda dapat menggunakan IOErrorsebagai gantinya ( FileNotFoundErrorsubkelas mana ) stackoverflow.com/a/21368457/1960959
scottclowe
7
@mapapuf Anda dapat membukanya untuk "memperbarui" ( open('file', 'r+')) dan kemudian mencari sampai akhir.
kyrill
2111

Anda memiliki os.path.existsfungsi:

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

Ini mengembalikan Truefile dan direktori tetapi Anda bisa menggunakannya

os.path.isfile(file_path)

untuk menguji apakah itu file khusus. Ini mengikuti symlink.

PierreBdR
sumber
966

Berbeda isfile(), exists()akan kembali Trueuntuk direktori. Jadi tergantung pada apakah Anda hanya menginginkan file biasa atau juga direktori, Anda akan menggunakan isfile()atau exists(). Berikut adalah beberapa output REPL sederhana:

>>> os.path.isfile("/etc/password.txt")
True
>>> os.path.isfile("/etc")
False
>>> os.path.isfile("/does/not/exist")
False
>>> os.path.exists("/etc/password.txt")
True
>>> os.path.exists("/etc")
True
>>> os.path.exists("/does/not/exist")
False
bortzmeyer
sumber
623
import os.path

if os.path.isfile(filepath):
Paul
sumber
320

Gunakan os.path.isfile()dengan os.access():

import os

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")
Yugal Jindle
sumber
60
memiliki beberapa kondisi, beberapa di antaranya berlebihan, kurang jelas dan eksplisit.
wim
10
Itu juga berlebihan. Jika file tidak ada, os.access()akan mengembalikan false.
Marquis of Lorne
9
@ EJP Dalam file linux bisa ada tetapi tidak dapat diakses.
e-info128
8
karena Anda import os, Anda tidak perlu import os.pathlagi karena sudah menjadi bagian dari os. Anda hanya perlu mengimpor os.pathjika Anda hanya akan menggunakan fungsi dari os.pathdan bukan dari ositu sendiri, untuk mengimpor hal yang lebih kecil, tetapi saat Anda menggunakan os.accessdan os.R_OK, impor kedua tidak diperlukan.
Jester
287
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
bermanfaat
sumber
2
Secara umum, praktik yang tidak baik untuk menamai variabel sama dengan nama metode.
Homunculus Reticulli
245

Meskipun hampir setiap cara yang mungkin telah terdaftar di (setidaknya satu dari) jawaban yang ada (misalnya, hal-hal spesifik Python ditambahkan), saya akan mencoba untuk mengelompokkan semuanya menjadi satu.

Catatan : setiap bagian dari kode pustaka standar Python yang akan saya posting, milik versi 3.5.3 .

Pernyataan masalah :

  1. Periksa file ( dapat diperdebatkan : juga folder (file "khusus")?) Keberadaan
  2. Jangan gunakan blok try / Kecuali / else / akhirnya

Kemungkinan solusi :

  1. [Python 3]: os.path. exists ( path ) (juga memeriksa anggota fungsi keluarga lain seperti os.path.isfile, os.path.isdir, os.path.lexistsuntuk perilaku yang sedikit berbeda)

    os.path.exists(path)

    Kembali Truejika jalur merujuk ke jalur yang ada atau deskriptor file terbuka. Pengembalian Falseuntuk tautan simbolis yang rusak. Pada beberapa platform, fungsi ini dapat kembali Falsejika izin tidak diberikan untuk mengeksekusi os.stat () pada file yang diminta, bahkan jika path ada secara fisik.

    Semua baik, tetapi jika mengikuti pohon impor:

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

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

    itu hanya blok coba / kecuali sekitar [Python 3]: os. stat ( path, *, dir_fd = Tidak Ada, follow_symlinks = Benar ) . Jadi, kode Anda dicoba / kecuali gratis, tetapi lebih rendah di framestack ada (setidaknya) satu blok tersebut. Ini juga berlaku untuk fungsi lainnya ( termasuk os.path.isfile ).

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

    • Ini cara yang lebih bagus (dan lebih banyak python ic) untuk menangani jalur, tetapi
    • Di bawah tenda, ia melakukan hal yang persis sama ( pathlib.py , line ~ # 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]: Dengan Manajer Konteks Pernyataan . Antara:

    • Buat satu:

      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 ...)
      • Dan penggunaannya - Saya akan meniru os.path.isfileperilaku (catatan bahwa ini hanya untuk menunjukkan tujuan, jangan tidak mencoba untuk menulis kode tersebut untuk produksi ):

        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
    • Gunakan [Python 3]: contextlib. suppress ( * exceptionions ) - yang secara khusus dirancang untuk pengecualian penekan selektif


    Tapi, mereka tampaknya menjadi pembungkus try / kecuali / else / akhirnya blok, seperti [Python 3]: Pernyataan with menyatakan:

    Ini memungkinkan percobaan umum ... kecuali ... akhirnya pola penggunaan dienkapsulasi untuk penggunaan kembali yang nyaman.

  3. Fungsi traversal sistem file (dan cari hasil untuk item yang cocok)


    Karena ini beralih ke folder, (dalam sebagian besar kasus) mereka tidak efisien untuk masalah kita (ada pengecualian, seperti glob bing non wildcarded - seperti yang ditunjukkan @ShadowRanger), jadi saya tidak akan memaksa mereka. Belum lagi bahwa dalam beberapa kasus, pemrosesan nama file mungkin diperlukan.

  4. [Python 3]: os. akses ( jalan, modus, *, dir_fd = None, effective_ids = False, follow_symlinks = True ) yang perilakunya dekat os.path.exists(sebenarnya itu lebih luas, terutama karena 2 nd argumen)

    • izin pengguna mungkin membatasi file "visibilitas" seperti yang dinyatakan dokumen:

      ... uji apakah pengguna yang memohon memiliki akses ke jalur yang ditentukan . mode harus F_OK untuk menguji keberadaan jalur ...

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

    Karena saya juga bekerja di C , saya menggunakan metode ini juga karena di bawah tenda, itu panggilan asli API s (sekali lagi, melalui "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c" ), tetapi juga membuka pintu untuk kemungkinan pengguna kesalahan , dan itu bukan sebagai Python ic seperti varian lainnya. Jadi, seperti yang ditunjukkan @AaronHall dengan benar, jangan gunakan kecuali Anda tahu apa yang Anda lakukan:

    Catatan : memanggil API asli juga dimungkinkan melalui [Python 3]: ctypes - Pustaka fungsi asing untuk Python , tetapi dalam kebanyakan kasus itu lebih rumit.

    ( Menang spesifik): Karena vcruntime * ( msvcr * ) .dll mengekspor [MS.Doc]: _access, keluarga fungsi _waccess juga, berikut ini contohnya:

    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

    Catatan :

    • Meskipun ini bukan praktik yang baik, saya menggunakan os.F_OKpanggilan, tapi itu hanya untuk kejelasan (nilainya 0 )
    • Saya menggunakan _waccess sehingga kode yang sama berfungsi pada Python3 dan Python2 (terlepas dari perbedaan terkait unicode di antara mereka)
    • Meskipun ini menargetkan area yang sangat spesifik, itu tidak disebutkan dalam jawaban sebelumnya


    The lnx ( Ubtu (16 x64) ) rekan juga:

    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

    Catatan :

    • Alih-alih jalur libc hardcoding ( "/lib/x86_64-linux-gnu/libc.so.6" ) yang dapat (dan kemungkinan besar, akan) bervariasi di seluruh sistem, Tidak ada (atau string kosong) dapat diteruskan ke konstruktor CDLL ( ctypes.CDLL(None).access(b"/tmp", os.F_OK)). Menurut [man7]: DLOPEN (3) :

      Jika nama file NULL, maka pegangan yang dikembalikan adalah untuk program utama. Ketika diberikan ke dlsym (), gagang ini menyebabkan pencarian simbol di program utama, diikuti oleh semua objek bersama yang dimuat saat startup program, dan kemudian semua objek bersama yang dimuat oleh dlopen () dengan bendera RTLD_GLOBAL .

      • Program utama (saat ini) ( python ) terhubung dengan libc , jadi simbolnya (termasuk akses ) akan dimuat
      • Ini harus ditangani dengan hati-hati, karena fungsi seperti main , Py_Main dan (semua) lainnya tersedia; memanggil mereka dapat memiliki efek bencana (pada program saat ini)
      • Ini juga tidak berlaku untuk Win (tapi itu bukan masalah besar, karena msvcrt.dll terletak di "% SystemRoot% \ System32" yang dalam % PATH% secara default). Saya ingin mengambil hal-hal lebih lanjut dan mereplikasi perilaku ini pada Win (dan mengirimkan tambalan), tetapi ternyata, [MS.Docs]: Fungsi GetProcAddress hanya "melihat" simbol yang diekspor , jadi kecuali jika seseorang menyatakan fungsi di executable utama sebagai __declspec(dllexport)(mengapa di bumi orang biasa akan melakukan itu?), program utama dapat dimuat tetapi cukup banyak tidak dapat digunakan
  5. Instal beberapa modul pihak ketiga dengan kemampuan sistem file

    Kemungkinan besar, akan bergantung pada salah satu cara di atas (mungkin dengan sedikit penyesuaian).
    Salah satu contoh akan menjadi (lagi, Win spesifik) [GitHub]: mhammond / pywin32 - Python for Windows (pywin32) Extensions , yang merupakan pembungkus Python atas WINAPI .

    Tapi, karena ini lebih seperti solusi, saya berhenti di sini.

  6. Solusi (lumpuh) lain ( gainarie ) adalah (seperti saya suka menyebutnya,) pendekatan sysadmin : gunakan Python sebagai pembungkus untuk mengeksekusi perintah shell

    • Menangkan :

      (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

Intinya :

  • Jangan gunakan try / Kecuali / else / akhirnya blok, karena mereka dapat mencegah Anda mengalami serangkaian masalah buruk. Contoh tandingan yang dapat saya pikirkan adalah kinerja: blok seperti itu mahal, jadi cobalah untuk tidak menempatkannya dalam kode yang seharusnya dijalankan ratusan ribu kali per detik (tetapi karena (dalam kebanyakan kasus) ini melibatkan akses disk, tidak akan demikian).

Catatan akhir :

  • Saya akan mencoba untuk tetap up to date, ada saran yang diterima, saya akan memasukkan apa pun yang berguna yang akan muncul dalam jawabannya
CristiFati
sumber
3
Bisakah Anda menguraikan pernyataan ini? "Meskipun ini bukan praktik yang baik, saya menggunakan os.F_OK dalam panggilan, tapi itu hanya untuk kejelasan (nilainya 0)"
sk8asd123
6
@ sk8asd123: Agak sulit untuk melakukannya dalam komentar: umumnya, yang terbaik adalah menggunakan konstanta dengan fungsi yang mereka gunakan bersama. Itu berlaku ketika bekerja dengan beberapa modul yang mendefinisikan konstanta yang sama, karena beberapa mungkin tidak up to date, dan yang terbaik untuk fungsi dan konstanta untuk disinkronkan. Ketika bekerja dengan ctypes (memanggil fungsi secara langsung) saya harus mendefinisikan konstanta (dari MSDN ), atau tidak menggunakan konstanta sama sekali. Itu hanya pedoman yang saya gunakan, dalam 99,9% mungkin tidak ada bedanya (secara fungsional).
CristiFati
3
@CristiFati: Pada 3.6, glob.iglob(dan glob.globjuga) didasarkan padaos.scandir , jadi sekarang malas; untuk mendapatkan hit pertama dalam direktori file 10M, Anda hanya memindai sampai mencapai hit pertama. Dan bahkan pra-3.6, jika Anda menggunakan globmetode tanpa o wildcard, fungsinya cerdas: Ia tahu Anda hanya dapat memiliki satu hit, sehingga menyederhanakan globbing menjadi adil os.path.isdiratauos.path.lexists (tergantung pada apakah path berakhir /).
ShadowRanger
3
Bagian kedua dari komentar saya (non-wildcarded globbing tidak benar-benar melakukan iterate folder, dan tidak pernah ada) tidak berarti itu adalah solusi yang sangat efisien untuk masalah (lebih lambat daripada menelepon langsung os.path.isdiratau os.path.lexistkarena itu adalah sekelompok panggilan fungsi level Python dan string operasi sebelum memutuskan jalur efisien dapat dijalankan, tetapi tidak ada pemanggilan sistem tambahan atau kerja I / O, yang urutannya lebih lambat).
ShadowRanger
154

Ini adalah cara paling sederhana untuk memeriksa apakah ada file. Hanya karena file itu ada ketika Anda memeriksa tidak menjamin bahwa itu akan ada di sana ketika Anda perlu membukanya.

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")
un33k
sumber
17
Selama Anda berniat untuk mengakses file, kondisi lomba memang ada , terlepas dari bagaimana program Anda dibangun. Program Anda tidak dapat menjamin bahwa proses lain di komputer belum mengubah file. Itulah yang Eric Lippert sebut sebagai pengecualian eksogen . Anda tidak dapat menghindarinya dengan memeriksa keberadaan file sebelumnya.
Isaac Supeene
@IsaacSupeene Praktik terbaik adalah membuat jendela operasi (file) sekecil mungkin diikuti oleh penanganan pengecualian yang tepat
un33k
145

Python 3.4+ memiliki modul path berorientasi objek: pathlib . Menggunakan modul baru ini, Anda dapat memeriksa apakah ada file seperti ini:

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

Anda dapat (dan biasanya seharusnya) masih menggunakan try/exceptblok ketika membuka file:

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

Modul pathlib memiliki banyak hal keren di dalamnya: globbing yang nyaman, memeriksa pemilik file, bergabung dengan jalur yang lebih mudah, dll. Perlu dicoba. Jika Anda menggunakan Python yang lebih lama (versi 2.6 atau yang lebih baru), Anda masih dapat menginstal pathlib dengan pip:

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

Kemudian impor sebagai berikut:

# Older Python versions
import pathlib2 as pathlib
Cody Piersall
sumber
124

Lebih suka pernyataan coba. Itu dianggap gaya yang lebih baik dan menghindari kondisi balapan.

Jangan mengambil kata saya untuk itu. Ada banyak dukungan untuk teori ini. Inilah pasangan:

pkoch
sumber
3
Harap tambahkan sumber yang lebih baik untuk mendukung pernyataan Anda.
BlueTrin
11
Tautan Kondisi Menghindari Ras yang dikutip (dukungan pengembang apel) tidak mendukung jawaban Anda. Ini menyangkut hanya menggunakan file-file sementara yang berisi informasi sensitif pada sistem operasi yang dirancang dengan buruk yang tidak mem-sandbox file / direktori sementara dengan benar melalui izin terbatas. Menggunakan try...excepttidak membantu menyelesaikan bahwa masalah pula.
jstine
Masalah dengan metode ini, adalah bahwa jika Anda memiliki sepotong kode penting tergantung pada file yang tidak ada, memasukkannya ke dalam except:klausa akan membuat pengecualian yang muncul di bagian kode Anda ini akan menimbulkan pesan yang membingungkan (kesalahan kedua muncul selama pemrosesan yang pertama.)
Camion
119

Bagaimana cara memeriksa apakah ada file, menggunakan Python, tanpa menggunakan pernyataan coba-coba?

Sekarang tersedia sejak Python 3.4, impor dan instantiate Pathobjek dengan nama file, dan periksa is_filemetode (perhatikan bahwa ini mengembalikan True untuk symlink yang menunjuk ke file biasa juga):

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

Jika Anda menggunakan Python 2, Anda bisa backport modul pathlib dari pypi pathlib2,, atau periksa isfiledari os.pathmodul:

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

Sekarang jawaban di atas mungkin merupakan jawaban langsung pragmatis terbaik di sini, tetapi ada kemungkinan kondisi ras (tergantung pada apa yang ingin Anda capai), dan fakta bahwa implementasi yang mendasarinya menggunakan a try, tetapi Python menggunakan trydi mana-mana dalam implementasinya.

Karena Python menggunakan di trymana-mana, benar-benar tidak ada alasan untuk menghindari implementasi yang menggunakannya.

Tetapi sisa dari jawaban ini mencoba untuk mempertimbangkan peringatan ini.

Lagi, jawaban yang jauh lebih menyolok

Tersedia sejak Python 3.4, gunakan Pathobjek baru di pathlib. Catatan yang .existstidak tepat, karena direktori bukan file (kecuali dalam arti unix bahwa semuanya adalah file).

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

Jadi kita perlu menggunakan is_file:

>>> root.is_file()
False

Inilah bantuan untuk is_file:

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

Jadi mari kita dapatkan file yang kita tahu adalah file:

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

Secara default, NamedTemporaryFilemenghapus file ketika ditutup (dan secara otomatis akan menutup ketika tidak ada lagi referensi).

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

Jika Anda menggali implementasi , Anda akan melihat bahwa is_filemenggunakan 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

Kondisi Balapan: Mengapa kami suka mencoba

Kami suka trykarena itu menghindari kondisi balapan. Dengan try, Anda hanya mencoba membaca file Anda, berharap ada di sana, dan jika tidak, Anda menangkap pengecualian dan melakukan apa pun perilaku mundur yang masuk akal.

Jika Anda ingin memeriksa apakah ada file sebelum Anda mencoba untuk membacanya, dan Anda mungkin menghapusnya dan kemudian Anda mungkin menggunakan beberapa utas atau proses, atau program lain tahu tentang file itu dan dapat menghapusnya - Anda berisiko terkena suatu kondisi lomba jika Anda memeriksa itu ada, karena Anda kemudian berlomba untuk membukanya sebelum nya kondisi (keberadaannya) berubah.

Kondisi ras sangat sulit untuk di-debug karena ada jendela yang sangat kecil di mana mereka dapat menyebabkan program Anda gagal.

Tetapi jika ini adalah motivasi Anda, Anda bisa mendapatkan nilai trypernyataan dengan menggunakan suppressmanajer konteks.

Menghindari kondisi balapan tanpa pernyataan coba: suppress

Python 3.4 memberi kita suppressmanajer konteks (sebelumnya ignoremanajer konteks), yang melakukan hal yang sama persis secara semantik dalam lebih sedikit baris, sementara juga (setidaknya secara dangkal) memenuhi yang asli meminta untuk menghindari trypernyataan:

from contextlib import suppress
from pathlib import Path

Pemakaian:

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

Untuk Python sebelumnya, Anda bisa menggulung sendiri suppress, tetapi tanpa trywasiat akan lebih bertele-tele daripada dengan. Saya percaya ini sebenarnya adalah satu-satunya jawaban yang tidak digunakan trypada level apa pun dalam Python yang dapat diterapkan sebelum Python 3.4 karena ia menggunakan manajer konteks sebagai gantinya:

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)

Mungkin lebih mudah dengan mencoba:

from contextlib import contextmanager

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

Opsi lain yang tidak memenuhi permintaan "tanpa coba":

isfile

import os
os.path.isfile(path)

dari dokumen :

os.path.isfile(path)

Return True jika path adalah file biasa yang sudah ada. Ini mengikuti tautan simbolik, sehingga keduanya islink()dan isfile()bisa benar untuk jalur yang sama.

Tetapi jika Anda memeriksa sumber fungsi ini, Anda akan melihatnya benar-benar menggunakan pernyataan coba:

# 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

Semua yang dilakukannya adalah menggunakan jalur yang diberikan untuk melihat apakah bisa mendapatkan statistik, menangkap OSErrordan kemudian memeriksa apakah itu file jika tidak memunculkan pengecualian.

Jika Anda berniat melakukan sesuatu dengan file tersebut, saya akan menyarankan langsung mencoba dengan mencoba-kecuali untuk menghindari kondisi balapan:

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

akses

Tersedia untuk Unix dan Windows os.access, tetapi untuk menggunakan Anda harus melewati flag, dan itu tidak membedakan antara file dan direktori. Ini lebih digunakan untuk menguji apakah pengguna yang benar-benar memohon memiliki akses di lingkungan privilege yang tinggi:

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

Itu juga menderita masalah kondisi ras yang sama seperti isfile. Dari dokumen :

Catatan: Menggunakan akses () untuk memeriksa apakah pengguna berwenang misalnya membuka file sebelum benar-benar melakukannya menggunakan open () menciptakan lubang keamanan, karena pengguna dapat mengeksploitasi interval waktu singkat antara memeriksa dan membuka file untuk memanipulasinya. Lebih disukai menggunakan teknik EAFP. Sebagai contoh:

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

lebih baik ditulis sebagai:

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

Hindari penggunaan os.access. Ini adalah fungsi tingkat rendah yang memiliki lebih banyak peluang untuk kesalahan pengguna daripada objek tingkat tinggi dan fungsi yang dibahas di atas.

Kritik atas jawaban lain:

Jawaban lain mengatakan ini tentang os.access:

Secara pribadi, saya lebih suka yang ini karena di bawah tenda, ia memanggil API asli (melalui "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c"), tetapi juga membuka gerbang untuk kemungkinan kesalahan pengguna, dan itu tidak sama Pythonic dengan varian lainnya. :

Jawaban ini mengatakan lebih memilih metode non-Pythonic, rawan kesalahan, tanpa pembenaran. Tampaknya mendorong pengguna untuk menggunakan API tingkat rendah tanpa memahaminya.

Ini juga menciptakan manajer konteks yang, dengan tanpa syarat kembali True, memungkinkan semua Pengecualian (termasuk KeyboardInterruptdan SystemExit!) Berlalu secara diam-diam, yang merupakan cara yang baik untuk menyembunyikan bug.

Ini tampaknya mendorong pengguna untuk mengadopsi praktik buruk.

Aaron Hall
sumber
87
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!"

Mengimpor osmemudahkan navigasi dan melakukan tindakan standar dengan sistem operasi Anda.

Untuk referensi juga lihat Cara memeriksa apakah file ada menggunakan Python?

Jika Anda membutuhkan operasi tingkat tinggi, gunakan shutil.

atlas
sumber
9
Jawaban ini salah. os.path.existsmengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikan os.path.isfile.
Chris Johnson
84

Menguji file dan folder dengan os.path.isfile(), os.path.isdir()danos.path.exists()

Dengan asumsi bahwa "jalur" adalah jalur yang valid, tabel ini menunjukkan apa yang dikembalikan oleh setiap fungsi untuk file dan folder:

masukkan deskripsi gambar di sini

Anda juga dapat menguji apakah file menggunakan jenis file tertentu os.path.splitext()untuk mendapatkan ekstensi (jika Anda belum mengetahuinya)

>>> import os
>>> path = "path to a word document"
>>> os.path.isfile(path)
True
>>> os.path.splitext(path)[1] == ".docx" # test if the extension is .docx
True
Tom Fuller
sumber
72

Di 2016 cara terbaik masih menggunakan os.path.isfile:

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

Atau dengan Python 3 Anda bisa menggunakan pathlib:

import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
    ...
KaiBuxe
sumber
3
Bolehkah saya bertanya: Apa keuntungan menggunakan modul 'pathlib' daripada modul 'os' di python3 untuk pemeriksaan ini?
Joko
3
pathlibadalah solusi OOP python untuk jalur. Anda dapat melakukan lebih banyak dengan itu. Jika Anda hanya perlu memeriksa keberadaan, keuntungannya tidak begitu besar.
KaiBuxe
65

Sepertinya tidak ada perbedaan fungsional yang bermakna antara coba / kecuali dan isfile(), jadi Anda harus menggunakan yang masuk akal.

Jika Anda ingin membaca file, jika ada, lakukan

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

Tetapi jika Anda hanya ingin mengubah nama file jika ada, dan karena itu tidak perlu membukanya, lakukan

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

Jika Anda ingin menulis ke file, jika tidak ada, lakukan

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

Jika Anda perlu mengunci file, itu masalah lain.

chad
sumber
3
Jawaban ini salah. os.path.existsmengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikan os.path.isfile.
Chris Johnson
6
Pada contoh ketiga Anda, saya membuat tautan bernama filepathdengan waktu yang tepat, dan BAM , Anda menimpa file target. Anda harus melakukannya open(filepath, 'wx')di try...exceptblok untuk menghindari masalah ini.
Spectras
1
Dalam contoh kedua Anda, setidaknya di Windows, Anda akan mendapatkan OSErrorjika filepath + '.old'sudah ada: "Pada Windows, jika dst sudah ada, OSError akan dimunculkan bahkan jika itu adalah file; mungkin tidak ada cara untuk mengimplementasikan penggantian nama atom ketika dst menamai file yang ada. "
Tom Myddeltyn
@ TomMyddeltyn: Pada Python 3.3,os.replace portable melakukan penggantian diam dari file tujuan (identik dengan os.renameperilaku Linux) (hanya kesalahan jika nama tujuan ada dan merupakan direktori). Jadi Anda terjebak pada 2.x, tetapi pengguna Py3 telah memiliki opsi yang bagus selama beberapa tahun sekarang.
ShadowRanger
Pada renamecontoh: Itu masih harus dilakukan dengan try/ except. os.rename(atau os.replacePython modern) adalah atom; membuatnya memeriksa lalu mengganti nama memperkenalkan perlombaan yang tidak perlu dan panggilan sistem tambahan. Lakukan sajatry: os.replace(filepath, filepath + '.old') except OSError: pass
ShadowRanger
59

Anda dapat mencoba ini (lebih aman):

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

Ouput adalah:

([Errno 2] Tidak ada file atau direktori seperti itu: 'whatever.txt')

Kemudian, tergantung pada hasilnya, program Anda bisa tetap berjalan dari sana atau Anda dapat kode untuk menghentikannya jika Anda mau.

philberndt
sumber
18
Pertanyaan asli meminta solusi yang tidak menggunakantry
rrs
5
Jawaban ini melewatkan poin OP. Memeriksa apakah ada file tidak sama dengan memeriksa apakah Anda dapat membukanya. Akan ada kasus di mana file memang ada tetapi karena berbagai alasan, Anda tidak dapat membukanya.
Chris Johnson
51

Meskipun saya selalu merekomendasikan penggunaan trydan exceptpernyataan, berikut adalah beberapa kemungkinan untuk Anda (favorit pribadi saya gunakan os.access):

  1. Coba buka file:

    Membuka file akan selalu memverifikasi keberadaan file. Anda dapat membuat fungsi seperti itu:

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

    Jika itu False, itu akan menghentikan eksekusi dengan IOError atau OSError yang tidak ditangani di versi Python yang lebih baru. Untuk menangkap pengecualian, Anda harus menggunakan percobaan kecuali klausa. Tentu saja, Anda selalu dapat menggunakan trypernyataan exception` seperti itu (terima kasih kepada hsandt karena membuat saya berpikir):

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

    Ini akan memeriksa keberadaan apa yang Anda tentukan. Namun, ia memeriksa file dan direktori jadi waspadalah tentang bagaimana Anda menggunakannya.

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

    Ini akan memeriksa apakah Anda memiliki akses ke file. Itu akan memeriksa izin. Berdasarkan dokumentasi os.py, mengetik os.F_OK, itu akan memeriksa keberadaan jalan. Namun, menggunakan ini akan membuat lubang keamanan, karena seseorang dapat menyerang file Anda menggunakan waktu antara memeriksa izin dan membuka file. Anda sebaiknya langsung membuka file daripada memeriksa izinnya. ( EAFP vs LBYP ). Jika Anda tidak akan membuka file setelahnya, dan hanya memeriksa keberadaannya, maka Anda dapat menggunakan ini.

    Bagaimanapun, ini:

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

Saya juga harus menyebutkan bahwa ada dua cara agar Anda tidak dapat memverifikasi keberadaan file. Entah masalahnya permission deniedatau no such file or directory. Jika Anda menangkap IOError, atur IOError as e(seperti opsi saya yang pertama), lalu ketik print(e.args)agar Anda dapat dengan mudah menentukan masalah Anda. Saya harap ini membantu! :)

Zizouz212
sumber
51

Tanggal: 2017-12-04

Setiap solusi yang mungkin telah dicantumkan dalam jawaban lain.

Cara intuitif dan dapat diperdebatkan untuk memeriksa apakah ada file adalah sebagai berikut:

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

Saya membuat cheatsheet lengkap untuk referensi Anda:

#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']}
Kalkulus
sumber
37

Jika file ini untuk dibuka, Anda bisa menggunakan salah satu dari teknik berikut:

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

MEMPERBARUI

Hanya untuk menghindari kebingungan dan berdasarkan jawaban yang saya dapatkan, jawaban saat ini menemukan file atau direktori dengan nama yang diberikan.

bergercookie
sumber
9
Jawaban ini salah. os.path.existsmengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikan os.path.isfile.
Chris Johnson
punya masalah positif palsu juga.
Zorglub29
docs.python.org/3/library/os.path.html#os.path.exists Untuk pernyataan di atas dari chris >> os.path.exists (path)> Return True jika path merujuk ke path yang ada atau open deskriptor file. Mengembalikan False untuk tautan simbolik yang rusak. Pada beberapa platform, fungsi ini dapat mengembalikan False jika izin tidak diberikan untuk mengeksekusi os.stat () pada file yang diminta, bahkan jika path secara fisik ada. Berubah dalam versi 3.3: path sekarang bisa menjadi bilangan bulat: True dikembalikan jika itu adalah deskriptor file terbuka, False sebaliknya. Berubah dalam versi 3.6: Menerima objek seperti jalur.
JayRizzo
36

Selain itu, os.access():

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

Sedang R_OK,, W_OKdan X_OKbendera untuk menguji izin ( doc ).

zgoda
sumber
20
if os.path.isfile(path_to_file):
    try: 
        open(path_to_file)
            pass
    except IOError as e:
        print "Unable to open file"

Memunculkan pengecualian dianggap sebagai pendekatan yang dapat diterima, dan Pythonic, untuk kontrol aliran dalam program Anda. Pertimbangkan untuk menangani file yang hilang dengan IOErrors. Dalam situasi ini, pengecualian IOError akan dimunculkan jika file ada tetapi pengguna tidak memiliki izin baca.

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

CONvid19
sumber
3
OP bertanya bagaimana memeriksa apakah ada file. Mungkin saja ada file tetapi Anda tidak bisa membukanya. Oleh karena itu menggunakan membuka file sebagai proksi untuk memeriksa apakah file itu ada tidak benar: akan memiliki negatif palsu.
Chris Johnson
19

Jika Anda diimpor NumPy sudah untuk keperluan lain maka tidak ada kebutuhan untuk mengimpor perpustakaan lain seperti pathlib, os, paths, dll

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

Ini akan mengembalikan benar atau salah berdasarkan keberadaannya.

durjoy
sumber
18

Anda dapat menulis saran Brian tanpa try:.

from contextlib import suppress

with suppress(IOError), open('filename'):
    process()

suppressadalah bagian dari Python 3.4. Dalam rilis yang lebih lama Anda dapat dengan cepat menulis penekanan Anda sendiri:

from contextlib import contextmanager

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

Saya penulis paket yang sudah ada sekitar 10 tahun, dan memiliki fungsi yang menjawab pertanyaan ini secara langsung. Pada dasarnya, jika Anda menggunakan sistem non-Windows, itu digunakan Popenuntuk mengakses find. Namun, jika Anda menggunakan Windows, ia bereplikasi finddengan walker sistem file yang efisien.

Kode itu sendiri tidak menggunakan tryblok ... kecuali dalam menentukan sistem operasi dan dengan demikian mengarahkan Anda ke gaya "Unix" findatau hand-buillt find. Tes waktu menunjukkan bahwa trylebih cepat dalam menentukan OS, jadi saya menggunakannya di sana (tapi tidak di tempat lain).

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

Dan dokter ...

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

>>>

Implementasinya, jika Anda ingin melihatnya, ada di sini: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190

Mike McKerns
sumber
17

Periksa file atau direktori yang ada

Anda dapat mengikuti tiga cara ini:

Catatan1: os.path.isfileDigunakan hanya untuk file

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

Note2: os.path.existsDigunakan untuk file dan direktori

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

The pathlib.PathMetode (termasuk dalam Python 3 +, diinstal dengan pip untuk Python 2)

from pathlib import Path
Path(filename).exists()
Ali Hallaji
sumber
16

Menambahkan satu variasi kecil lagi yang tidak persis tercermin dalam jawaban lainnya.

Ini akan menangani case dari string file_pathsedang Noneatau kosong.

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

Menambahkan varian berdasarkan saran dari Shahbaz

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

Menambahkan varian berdasarkan saran dari Peter Wood

def file_exists(file_path):
    return file_path and os.path.isfile(file_path):
Marcel Wilson
sumber
3
if (x) return true; else return false;benar-benar adil return x. Empat baris terakhir Anda bisa menjadi return os.path.isfile(file_path). Sementara kita melakukannya, seluruh fungsi dapat disederhanakan return file_path and os.path.isfile(file_path).
Shahbaz
Anda harus berhati-hati return xdalam hal if (x). Python akan menganggap string kosong False dalam hal ini kita akan mengembalikan string kosong daripada bool. Tujuan dari fungsi ini adalah untuk selalu mengembalikan bool.
Marcel Wilson
1
Benar. Namun dalam hal ini, xsudah os.path.isfile(..)jadi bool.
Shahbaz
os.path.isfile(None)memunculkan pengecualian yang mengapa saya menambahkan cek jika. Saya mungkin hanya bisa membungkusnya dengan coba / kecuali tetapi saya merasa itu lebih eksplisit seperti ini.
Marcel Wilson
3
return file_path and os.path.isfile(file_path)
Peter Wood
15

Berikut adalah perintah Python 1 baris untuk lingkungan baris perintah Linux. Saya menemukan ini SANGAT HANDY karena saya bukan orang Bash panas.

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

Saya harap ini bermanfaat.

Cinta dan kedamaian - Joe Codeswell
sumber
6
Pemeriksaan satu baris dalam bash: [ -f "${file}" ] && echo "file found" || echo "file not found"(yang sama dengan if [ ... ]; then ...; else ...; fi).
flotzilla
12

Anda dapat menggunakan pustaka "OS" dari Python:

>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") 
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False
Pradip Das
sumber
5
Jawaban ini salah. os.path.existsmengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikan os.path.isfile.
Chris Johnson
@Chris Johnson, fungsi os.path.exists () memeriksa apakah jalur ada di sistem. PATH dapat berupa DIREKTORI atau FILE. Ini akan berfungsi dengan baik pada kedua kasus. Silakan coba dengan beberapa contoh
Pradip Das
Jadi, jawaban ini berhasil. Bagus. Jika jalurnya bukan file. Itukah pertanyaannya? Tidak.
Debosmit Ray
Tergantung. Jika tujuan menentukan keberadaan "file" adalah untuk mengetahui apakah path sudah ada (dan karena itu bukan path di mana data baru dapat disimpan tanpa menghapus informasi lain), maka boleh existssaja. Jika tujuannya adalah untuk menentukan apakah aman untuk membuka file yang mungkin ada, maka kritik tersebut dapat dibenarkan dan ada tidak cukup tepat. Sayangnya, OP tidak menentukan tujuan mana yang diinginkan (dan mungkin tidak akan melakukannya lagi).
starturtle
12

Bagaimana cara memeriksa apakah ada file, tanpa menggunakan pernyataan coba?

Pada 2016, ini masih bisa dibilang cara termudah untuk memeriksa apakah kedua file itu ada dan apakah itu file:

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

isfilesebenarnya hanya metode pembantu yang secara internal menggunakan os.statdan di stat.S_ISREG(mode)bawahnya. Ini os.statadalah metode tingkat rendah yang akan memberi Anda informasi terperinci tentang file, direktori, soket, buffer, dan banyak lagi. Lebih lanjut tentang os.stat di sini

Catatan: Namun, pendekatan ini tidak akan mengunci file dengan cara apa pun dan karena itu kode Anda dapat menjadi rentan terhadap bug " waktu pemeriksaan ke waktu penggunaan " ( TOCTTOU ).

Jadi, meningkatkan pengecualian dianggap sebagai pendekatan aliran kontrol yang dapat diterima, dan Pythonic, dalam program Anda. Dan orang harus mempertimbangkan menangani file yang hilang dengan IOErrors, bukan ifpernyataan ( hanya saran ).

Inconnu
sumber
9
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)
Khaled.K
sumber
@ j6m8 ya, isReadableFile(path,fileName)akan kembali Truejika file dapat dijangkau dan dibaca oleh proses \ program \ utas
Khaled.K