7 Cara untuk Memeriksa apakah File atau Folder Ada di Python
Diterbitkan: 2021-06-16Pustaka standar Python berisi sebagian besar fungsionalitas yang dibutuhkan pengembang untuk memecahkan masalah. Dalam tutorial ini, Anda akan mempelajari berbagai cara untuk memeriksa keberadaan file atau direktori hanya dengan menggunakan modul bawaan.
Memeriksa apakah file atau skrip berada di tempat yang benar sangat penting untuk program CLI apa pun. Program Anda bisa menjadi tidak berguna jika file tertentu tidak ada pada saat eksekusi.
Dalam tutorial hari ini, Anda akan mempelajari beberapa cara cepat untuk memeriksa apakah ada file atau folder dengan Python.
Sebelum memulai
Sebelum menjalankan perintah apa pun di bawah ini, pastikan Anda telah menginstal Python 3 di sistem Anda. Buka terminal Anda dan ketik perintah berikut:
python --version # Python 3.9.5, my resultJika Anda memiliki versi 2.x, Anda harus menggunakan perintah "python3". Lihat panduan instalasi Python kami jika Anda belum menginstal Python 3.
Kami akan menggunakan beberapa file uji bersama dengan tutorial ini, jadi pastikan untuk membuat file berikut:
touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txtPerintah di atas membuat file untuk bermain dengan, direktori pengujian, dan file lain dalam testingdirectory tersebut. File bisa kosong karena kita tidak perlu membaca isinya,
Catatan: Jika Anda menggunakan Windows, atur file struktur file sederhana dengan manajer file grafis.
Terakhir, kami akan menggunakan Ipython sebagai shell Python interaktif kami yang memberikan antarmuka yang cantik untuk digunakan. Ini hanya komoditas, oleh karena itu tidak sepenuhnya diperlukan.
pip install ipythonSetelah melakukan ini, Anda akan mendapatkan akses ke shell Python yang indah hanya dengan mengetik ipython .

Sekarang Anda sudah siap, mari selami cara untuk memeriksa apakah folder atau file ada di Python.
Coba, Buka, dan Kecuali
Ini adalah opsi yang paling mudah. Jika Anda mencoba membuka file yang tidak ada, Python akan memunculkan FileNotFoundError.
In [1]: open('im-not-here.txt') --------------------------------------------------------------------------- FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'Kami dapat mengambil keuntungan dari ini, dan menangani pengecualian jika file yang kami cari tidak ada.
In [2]: try: ...: file = open('im-not-here.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\' exist') ...: exit() ...: Sorry the file we're looking for doesn't existDalam kode di atas kami mencetak pesan khusus dan menghentikan eksekusi program jika file tidak ada.
Perhatikan bagaimana fungsi exit() hanya akan dijalankan jika pengecualian dimunculkan. Mari kita lihat apa yang terjadi ketika file yang kita cari benar-benar ada.
In [2]: try: ...: file = open('testfile.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>Perhatikan bagaimana kami menutup file tepat setelah kami membukanya. Ini dianggap sebagai praktik yang baik menurut dokumentasi Python.
Memanggil
<span class="pre">file.write()</span>tanpa menggunakan kata kunci<span class="pre">with</span>atau memanggil<span class="pre">file.close()</span>mungkin mengakibatkan argumen<span class="pre">file.write()</span>tidak sepenuhnya ditulis ke disk, meskipun program berhasil keluar.
Bahkan jika kami tidak menulis ke file, sangat disarankan untuk menutup file karena dapat menyebabkan beberapa masalah kinerja.
Jika kita tidak ingin menutup file sendiri, kita bisa menggunakan manajer konteks with . Ini mengalokasikan dan melepaskan sumber daya secara tepat, oleh karena itu kita tidak perlu menutup file.
In [3]: try: ...: with open('testfile.txt') as file: ...: print(file) ...: # No need to close the file ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>Metode ini sangat berguna saat menulis dalam file, tetapi hasilnya tidak efisien jika kita hanya ingin memeriksa apakah ada file. Mari selami opsi lain untuk mencapai ini.
os.path.ada()
Modul os menyediakan banyak fungsi untuk berinteraksi dengan sistem operasi. Untuk memeriksa apakah ada file atau folder, kita dapat menggunakan path. ada () fungsi yang menerima jalur ke file atau direktori sebagai argumen. Ini mengembalikan boolean berdasarkan keberadaan jalur.
Catatan: Jalur adalah lokasi unik dari file atau direktori dalam sistem file
Dalam Python, submodul os.path berisi fungsi yang dirancang khusus untuk beroperasi dengan jalur file. Semua fungsi ini menerima argumen jalur sebagai string atau byte, dan Anda dapat memutuskan untuk bekerja dengan jalur absolut, misalnya:
/home/daniel/.bashrcAtau dengan jalur relatif, tergantung pada direktori tempat Anda menjalankan skrip:
.bashrc # Running the script in my home folderBerikut adalah beberapa contoh menggunakan fungsi os.path.exists() , berjalan di direktori tempat file pengujian saya berada:
In [1]: import os In [2]: os.path.exists('testfile.txt') Out[2]: True In [3]: os.path.exists('testdirectory') Out[3]: True In [4]: os.path.exists('hey-i-dont-exist') Out[4]: FalseSeperti yang Anda lihat, ini mengembalikan True saat menguji dengan file testfile.txt dan folder testdirectory , dan False saat file tidak ada.
os.path.isfile()
Jika Anda hanya ingin membuktikan keberadaan file (bukan direktori), Anda akan memanggil fungsi os.path.isfile() .
In [1]: import os In [2]: os.path.isfile('testfile.txt') Out[2]: True In [3]: os.path.isfile('testdirectory/') Out[3]: False In [4]: os.path.isfile('i-dont-even-exist') Out[4]: False In [5]: os.path.isfile('testdirectory/otherfile.txt') Out[5]: TrueCatatan: Di UNIX semua direktori diakhiri dengan garis miring (/), sedangkan di Windows kita menggunakan garis miring terbalik (\).

Dalam kode di atas fungsi isfile() mengembalikan False pada dua kesempatan, mari kita lihat alasannya:
-
testdirectory/adalah direktori, oleh karena itu tidak dianggap sebagai file. Ini tidak sepenuhnya benar karena di Linux semuanya adalah deskriptor file, tetapi Python memperlakukan direktori secara berbeda hanya untuk kenyamanan (Jika Anda mencoba membuka direktori, Anda akan mendapatkan IsADirectoryError ) -
i-dont-even-existmenunjuk ke file yang ironisnya tidak ada
os.path.isdir()
Jika Anda ingin memeriksa direktori di tempat yang benar, Anda harus menggunakan fungsi os.path.isdir() , yang hanya mengembalikan True jika jalur yang diberikan menunjuk ke direktori.
In [1]: import os In [2]: os.path.isdir('testfile.txt') Out[2]: False In [3]: os.path.isdir('testdirectory') Out[3]: True In [4]: os.path.isdir('anotherfile.txt') Out[4]: FalsePerhatikan bagaimana contoh di atas mengembalikan False bahkan ketika jalur menunjuk ke file yang ada.
Gumpal
Modul glob menyediakan fungsi untuk bekerja dengan pola mirip shell Unix (karenanya tidak berfungsi dengan baik di Windows). Untuk memeriksa apakah file cocok dengan pola di dalam direktori saat ini, Anda dapat menggunakan fungsi glob.glob().
In [1]: import glob In [2]: glob.glob('testfile.txt') Out[2]: ['testfile.txt'] In [3]: glob.glob('testdirectory') Out[3]: ['testdirectory']Dalam kode di atas, pola yang diteruskan ke fungsi glob adalah string normal yang mewakili jalur ke file dan direktori uji. Karena kedua jalur ada, fungsi mengembalikan daftar dengan nama jalur yang cocok di dalamnya.
Catatan: Jika polanya tidak cocok, Anda akan mendapatkan daftar kosong.
Mengingat kita dapat meneruskan pola ke fungsi glob, mengapa tidak menguji beberapa keuntungan utamanya?
Kode di bawah ini mendapatkan semua jalur file dengan ekstensi .txt dan .py masing-masing:
In [4]: glob.glob('*.txt') Out[4]: ['testfile.txt'] In [5]: glob.glob('*.py') Out[5]: ['pathlib-exists.py', 'list-dir.py', 'glob-file.py', 'open-except.py', 'subprocess-test.py', 'isfile.py', 'exists.py', 'isdir.py']Menggunakan Kelas Jalur
Kelas Path adalah salah satu cara terbaik untuk bekerja dengan jalur karena memberi kita antarmuka yang bersih untuk bekerja dengan jalur File sebagai objek.
Yang menarik adalah bahwa instance Path memiliki semua metode yang Anda perlukan untuk mendapatkan info tentang jalur tertentu. Ini termasuk fungsi yang mirip dengan opsi sebelumnya.
Catatan: Anda memerlukan Python 3.4 atau lebih tinggi untuk menggunakan pustaka pathlib
Metode Path yang akan Anda gunakan:
- Jalur().ada()
- Jalur().is_file()
- Jalur().is_dir()
Periksa apakah ada jalur
In [1]: from pathlib import Path In [2]: Path('testfile.txt').exists() Out[2]: True In [3]: Path('im-not-here.txt').exists() Out[3]: False In [4]: Path('testdirectory').exists() Out[4]: TrueBekerja sama dengan os.path.exists() .
Periksa apakah jalur menunjuk ke file
In [5]: Path('testfile.txt').is_file() Out[5]: True In [6]: Path('testdirectory').is_file() Out[6]: FalseSetara dengan os.path.isfile() .
Periksa apakah jalurnya mengarah ke direktori
In [7]: Path('testfile.txt').is_dir() Out[7]: False In [8]: Path('testdirectory').is_dir() Out[8]: TrueSesuai dengan os.path.isdir().
subproses
Jika Anda seorang pecinta modul subproses, Anda harus tahu tentang opsi ini. Anda dapat menentukan apakah ada file atau folder dengan menggunakan perintah tes.
Catatan: Perintah tes hanya berfungsi di Unix.
Tanda uji berikut akan menyelesaikan pekerjaan:
- test -e: Periksa apakah ada jalur
- test -f: Periksa apakah ada file
- test-d: Periksa apakah ada folder
Jika Anda ingin mempelajari lebih banyak flag pengujian, Anda dapat membaca manual dengan menjalankan:
man testMemeriksa Jalur dengan subproses:
Kode di bawah ini menentukan apakah ada jalur dengan membandingkan kode kembalian dari subproses ke 0.
Ingat bahwa di Linux, jika suatu proses berjalan dengan baik, itu akan mengembalikan nol, jika tidak, itu akan mengembalikan kode lain.
In [1]: from subprocess import run In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0 Out[2]: True In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0 Out[3]: FalsePada pernyataan pertama, kita mengimpor modul subproses, kemudian menggunakan fungsi run dan mendapatkan kode pengembaliannya.
Memverifikasi keberadaan file dengan subproses
In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0 Out[4]: True In [5]: run(['test', '-f', 'testdirectory']).returncode == 0 Out[5]: FalseMemeriksa direktori dengan subproses:
In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0 Out[6]: False In [7]: run(['test', '-d', 'testdirectory']).returncode == 0 Out[7]: TrueTidak disarankan untuk menggunakan opsi ini karena menghabiskan lebih banyak sumber daya, dan kami tidak mendapatkan keuntungan apa pun darinya.
Untuk menyimpulkan
Python adalah salah satu bahasa pemrograman yang paling banyak digunakan untuk mengotomatisasi proses dengan berinteraksi dengan OS. Satu hal keren yang dapat Anda lakukan dengannya adalah memeriksa apakah ada file atau folder.
Yang paling mudah untuk melakukannya adalah:
- Membuka dan menangani pengecualian file segera
- Menggunakan fungsi existing () dari modul os.path atau pathlib .
Dalam tutorial ini Anda belajar:
- Cara membuka file dan menangani pengecualian jika tidak ada
- Arti dari path
- 3 fungsi berbeda yang disediakan submodul os.path untuk memeriksa keberadaan file atau folder
- Unix menggunakan garis miring (/), sedangkan Windows menggunakan garis miring terbalik (\)
Baca selanjutnya: Apa itu Subproses di Python? [5 Contoh Penggunaan]
