Bagaimana saya memeriksa apakah ada file atau tidak, tanpa menggunakan try
pernyataan?
sumber
Bagaimana saya memeriksa apakah ada file atau tidak, tanpa menggunakan try
pernyataan?
Jika alasan Anda mengecek adalah agar Anda dapat melakukan sesuatu seperti if file_exists: open_it()
, lebih aman menggunakan upaya try
sekitar 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
True
jika 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, pathlib
modul ini menawarkan pendekatan berorientasi objek (backported ke pathlib2
dalam 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 Path
objek 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 try
blok:
try:
my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
# doesn't exist
else:
# exists
FileNotFoundError
diperkenalkan di Python 3. Jika Anda juga perlu mendukung Python 2.7 dan juga Python 3, Anda dapat menggunakanIOError
sebagai gantinya (FileNotFoundError
subkelas mana ) stackoverflow.com/a/21368457/1960959open('file', 'r+')
) dan kemudian mencari sampai akhir.Anda memiliki
os.path.exists
fungsi:Ini mengembalikan
True
file dan direktori tetapi Anda bisa menggunakannyauntuk menguji apakah itu file khusus. Ini mengikuti symlink.
sumber
Berbeda
isfile()
,exists()
akan kembaliTrue
untuk direktori. Jadi tergantung pada apakah Anda hanya menginginkan file biasa atau juga direktori, Anda akan menggunakanisfile()
atauexists()
. Berikut adalah beberapa output REPL sederhana:sumber
sumber
Gunakan
os.path.isfile()
denganos.access()
:sumber
os.access()
akan mengembalikan false.import os
, Anda tidak perluimport os.path
lagi karena sudah menjadi bagian darios
. Anda hanya perlu mengimporos.path
jika Anda hanya akan menggunakan fungsi darios.path
dan bukan darios
itu sendiri, untuk mengimpor hal yang lebih kecil, tetapi saat Anda menggunakanos.access
danos.R_OK
, impor kedua tidak diperlukan.sumber
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 :
Kemungkinan solusi :
[Python 3]: os.path. exists ( path ) (juga memeriksa anggota fungsi keluarga lain seperti
os.path.isfile
,os.path.isdir
,os.path.lexists
untuk perilaku yang sedikit berbeda)Semua baik, tetapi jika mengikuti pohon impor:
os.path
- posixpath.py ( ntpath.py )genericpath.py , baris ~ # 20 +
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 ()
Di bawah tenda, ia melakukan hal yang persis sama ( pathlib.py , line ~ # 1330 ):
[Python 3]: Dengan Manajer Konteks Pernyataan . Antara:
Buat satu:
Dan penggunaannya - Saya akan meniru
os.path.isfile
perilaku (catatan bahwa ini hanya untuk menunjukkan tujuan, jangan tidak mencoba untuk menulis kode tersebut untuk produksi ):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:
Fungsi traversal sistem file (dan cari hasil untuk item yang cocok)
[Python 3]: os. listdir ( path = '.' ) (atau [Python 3]: os. scandir ( path = '.' ) pada Python v 3.5 +, backport: [PyPI]: scandir )
Di bawah tenda, keduanya menggunakan:
via [GitHub]: python / cpython - (master) cpython / Modul / posixmodule.c
os.listdir
(os.scandir
bila tersedia)glob.glob
)os.listdir
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.
[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)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:
Catatan :
os.F_OK
panggilan, tapi itu hanya untuk kejelasan (nilainya 0 )The lnx ( Ubtu (16 x64) ) rekan juga:
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) :__declspec(dllexport)
(mengapa di bumi orang biasa akan melakukan itu?), program utama dapat dimuat tetapi cukup banyak tidak dapat digunakanInstal 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.
Solusi (lumpuh) lain ( gainarie ) adalah (seperti saya suka menyebutnya,) pendekatan sysadmin : gunakan Python sebagai pembungkus untuk mengeksekusi perintah shell
Menangkan :
Nix ( Lnx ( Ubtu )):
Intinya :
Catatan akhir :
sumber
glob.iglob
(danglob.glob
juga) 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 menggunakanglob
metode tanpa o wildcard, fungsinya cerdas: Ia tahu Anda hanya dapat memiliki satu hit, sehingga menyederhanakan globbing menjadi adilos.path.isdir
atauos.path.lexists
(tergantung pada apakah path berakhir/
).os.path.isdir
atauos.path.lexist
karena 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).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.
sumber
Python 3.4+ memiliki modul path berorientasi objek: pathlib . Menggunakan modul baru ini, Anda dapat memeriksa apakah ada file seperti ini:
Anda dapat (dan biasanya seharusnya) masih menggunakan
try/except
blok ketika membuka file: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:
Kemudian impor sebagai berikut:
sumber
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:
sumber
try...except
tidak membantu menyelesaikan bahwa masalah pula.except:
klausa akan membuat pengecualian yang muncul di bagian kode Anda ini akan menimbulkan pesan yang membingungkan (kesalahan kedua muncul selama pemrosesan yang pertama.)Sekarang tersedia sejak Python 3.4, impor dan instantiate
Path
objek dengan nama file, dan periksais_file
metode (perhatikan bahwa ini mengembalikan True untuk symlink yang menunjuk ke file biasa juga):Jika Anda menggunakan Python 2, Anda bisa backport modul pathlib dari pypi
pathlib2
,, atau periksaisfile
darios.path
modul: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 menggunakantry
di mana-mana dalam implementasinya.Karena Python menggunakan di
try
mana-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
Path
objek baru dipathlib
. Catatan yang.exists
tidak tepat, karena direktori bukan file (kecuali dalam arti unix bahwa semuanya adalah file).Jadi kita perlu menggunakan
is_file
:Inilah bantuan untuk
is_file
:Jadi mari kita dapatkan file yang kita tahu adalah file:
Secara default,
NamedTemporaryFile
menghapus file ketika ditutup (dan secara otomatis akan menutup ketika tidak ada lagi referensi).Jika Anda menggali implementasi , Anda akan melihat bahwa
is_file
menggunakantry
:Kondisi Balapan: Mengapa kami suka mencoba
Kami suka
try
karena itu menghindari kondisi balapan. Dengantry
, 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
try
pernyataan dengan menggunakansuppress
manajer konteks.Menghindari kondisi balapan tanpa pernyataan coba:
suppress
Python 3.4 memberi kita
suppress
manajer konteks (sebelumnyaignore
manajer konteks), yang melakukan hal yang sama persis secara semantik dalam lebih sedikit baris, sementara juga (setidaknya secara dangkal) memenuhi yang asli meminta untuk menghindaritry
pernyataan:Pemakaian:
Untuk Python sebelumnya, Anda bisa menggulung sendiri
suppress
, tetapi tanpatry
wasiat akan lebih bertele-tele daripada dengan. Saya percaya ini sebenarnya adalah satu-satunya jawaban yang tidak digunakantry
pada level apa pun dalam Python yang dapat diterapkan sebelum Python 3.4 karena ia menggunakan manajer konteks sebagai gantinya:Mungkin lebih mudah dengan mencoba:
Opsi lain yang tidak memenuhi permintaan "tanpa coba":
isfile
dari dokumen :
Tetapi jika Anda memeriksa sumber fungsi ini, Anda akan melihatnya benar-benar menggunakan pernyataan coba:
Semua yang dilakukannya adalah menggunakan jalur yang diberikan untuk melihat apakah bisa mendapatkan statistik, menangkap
OSError
dan 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:
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:Itu juga menderita masalah kondisi ras yang sama seperti
isfile
. Dari dokumen :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
: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 (termasukKeyboardInterrupt
danSystemExit
!) Berlalu secara diam-diam, yang merupakan cara yang baik untuk menyembunyikan bug.Ini tampaknya mendorong pengguna untuk mengadopsi praktik buruk.
sumber
Mengimpor
os
memudahkan 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
.sumber
os.path.exists
mengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikanos.path.isfile
.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:
Anda juga dapat menguji apakah file menggunakan jenis file tertentu
os.path.splitext()
untuk mendapatkan ekstensi (jika Anda belum mengetahuinya)sumber
Di 2016 cara terbaik masih menggunakan
os.path.isfile
:Atau dengan Python 3 Anda bisa menggunakan
pathlib
:sumber
pathlib
adalah solusi OOP python untuk jalur. Anda dapat melakukan lebih banyak dengan itu. Jika Anda hanya perlu memeriksa keberadaan, keuntungannya tidak begitu besar.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
Tetapi jika Anda hanya ingin mengubah nama file jika ada, dan karena itu tidak perlu membukanya, lakukan
Jika Anda ingin menulis ke file, jika tidak ada, lakukan
Jika Anda perlu mengunci file, itu masalah lain.
sumber
os.path.exists
mengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikanos.path.isfile
.filepath
dengan waktu yang tepat, dan BAM , Anda menimpa file target. Anda harus melakukannyaopen(filepath, 'wx')
ditry...except
blok untuk menghindari masalah ini.OSError
jikafilepath + '.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. "os.replace
portable melakukan penggantian diam dari file tujuan (identik denganos.rename
perilaku 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.rename
contoh: Itu masih harus dilakukan dengantry
/except
.os.rename
(atauos.replace
Python 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
Anda dapat mencoba ini (lebih aman):
Ouput adalah:
Kemudian, tergantung pada hasilnya, program Anda bisa tetap berjalan dari sana atau Anda dapat kode untuk menghentikannya jika Anda mau.
sumber
try
Meskipun saya selalu merekomendasikan penggunaan
try
danexcept
pernyataan, berikut adalah beberapa kemungkinan untuk Anda (favorit pribadi saya gunakanos.access
):Coba buka file:
Membuka file akan selalu memverifikasi keberadaan file. Anda dapat membuat fungsi seperti itu:
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
try
pernyataan exception` seperti itu (terima kasih kepada hsandt karena membuat saya berpikir):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.
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:
Saya juga harus menyebutkan bahwa ada dua cara agar Anda tidak dapat memverifikasi keberadaan file. Entah masalahnya
permission denied
atauno such file or directory
. Jika Anda menangkapIOError
, aturIOError as e
(seperti opsi saya yang pertama), lalu ketikprint(e.args)
agar Anda dapat dengan mudah menentukan masalah Anda. Saya harap ini membantu! :)sumber
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:
Saya membuat cheatsheet lengkap untuk referensi Anda:
sumber
Jika file ini untuk dibuka, Anda bisa menggunakan salah satu dari teknik berikut:
MEMPERBARUI
Hanya untuk menghindari kebingungan dan berdasarkan jawaban yang saya dapatkan, jawaban saat ini menemukan file atau direktori dengan nama yang diberikan.
sumber
os.path.exists
mengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikanos.path.isfile
.Selain itu,
os.access()
:Sedang
R_OK
,,W_OK
danX_OK
bendera untuk menguji izin ( doc ).sumber
SRC: http://www.pfinn.net/python-check-if-file-exists.html
sumber
Jika Anda diimpor NumPy sudah untuk keperluan lain maka tidak ada kebutuhan untuk mengimpor perpustakaan lain seperti
pathlib
,os
,paths
, dllIni akan mengembalikan benar atau salah berdasarkan keberadaannya.
sumber
Anda dapat menulis saran Brian tanpa
try:
.suppress
adalah bagian dari Python 3.4. Dalam rilis yang lebih lama Anda dapat dengan cepat menulis penekanan Anda sendiri:sumber
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
Popen
untuk mengaksesfind
. Namun, jika Anda menggunakan Windows, ia bereplikasifind
dengan walker sistem file yang efisien.Kode itu sendiri tidak menggunakan
try
blok ... kecuali dalam menentukan sistem operasi dan dengan demikian mengarahkan Anda ke gaya "Unix"find
atau hand-builltfind
. Tes waktu menunjukkan bahwatry
lebih cepat dalam menentukan OS, jadi saya menggunakannya di sana (tapi tidak di tempat lain).Dan dokter ...
Implementasinya, jika Anda ingin melihatnya, ada di sini: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190
sumber
Periksa file atau direktori yang ada
Anda dapat mengikuti tiga cara ini:
sumber
Menambahkan satu variasi kecil lagi yang tidak persis tercermin dalam jawaban lainnya.
Ini akan menangani case dari string
file_path
sedangNone
atau kosong.Menambahkan varian berdasarkan saran dari Shahbaz
Menambahkan varian berdasarkan saran dari Peter Wood
sumber
if (x) return true; else return false;
benar-benar adilreturn x
. Empat baris terakhir Anda bisa menjadireturn os.path.isfile(file_path)
. Sementara kita melakukannya, seluruh fungsi dapat disederhanakanreturn file_path and os.path.isfile(file_path)
.return x
dalam halif (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.x
sudahos.path.isfile(..)
jadi bool.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.return file_path and os.path.isfile(file_path)
Berikut adalah perintah Python 1 baris untuk lingkungan baris perintah Linux. Saya menemukan ini SANGAT HANDY karena saya bukan orang Bash panas.
Saya harap ini bermanfaat.
sumber
[ -f "${file}" ] && echo "file found" || echo "file not found"
(yang sama denganif [ ... ]; then ...; else ...; fi
).Anda dapat menggunakan pustaka "OS" dari Python:
sumber
os.path.exists
mengembalikan true untuk hal-hal yang bukan file, seperti direktori. Ini memberikan positif palsu. Lihat jawaban lain yang merekomendasikanos.path.isfile
.exists
saja. 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).Pada 2016, ini masih bisa dibilang cara termudah untuk memeriksa apakah kedua file itu ada dan apakah itu file:
isfile
sebenarnya hanya metode pembantu yang secara internal menggunakanos.stat
dan distat.S_ISREG(mode)
bawahnya. Inios.stat
adalah metode tingkat rendah yang akan memberi Anda informasi terperinci tentang file, direktori, soket, buffer, dan banyak lagi. Lebih lanjut tentang os.stat di siniCatatan: 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
if
pernyataan ( hanya saran ).sumber
sumber
isReadableFile(path,fileName)
akan kembaliTrue
jika file dapat dijangkau dan dibaca oleh proses \ program \ utas