Python'da Bir Dosya veya Klasörün Var Olup Olmadığını Kontrol Etmenin 7 Yolu
Yayınlanan: 2021-06-16Python standart kitaplığı, bir geliştiricinin bir sorunu çözmek için ihtiyaç duyacağı işlevlerin çoğunu içerir. Bu öğreticide, yalnızca yerleşik modülleri kullanarak bir dosyanın veya dizinin varlığını kontrol etmenin farklı yollarını öğreneceksiniz.
Bir dosyanın veya komut dosyasının doğru yerde olup olmadığını kontrol etmek, herhangi bir CLI programı için çok önemlidir. Yürütme anında belirli bir dosya yerinde değilse, programınız işe yaramaz hale gelebilir.
Bugünkü öğreticide, Python'da bir dosya veya klasörün var olup olmadığını kontrol etmenin bazı hızlı yollarını öğreneceksiniz.
Başlamadan önce
Aşağıdaki herhangi bir komutu çalıştırmadan önce, sisteminizde Python 3'ün kurulu olduğundan emin olun. Terminalinizi açın ve aşağıdaki komutu yazın:
python --version # Python 3.9.5, my result2.x sürümünüz varsa, “python3” komutunu kullanmanız gerekecektir. Python 3 kurulu değilse Python kurulum kılavuzumuza bakın.
Bu eğitimle birlikte bazı test dosyaları kullanacağız, bu nedenle aşağıdaki dosyaları oluşturduğunuzdan emin olun:
touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txtYukarıdaki komutlar, oynatılacak bir dosya, bir test dizini ve testdizini içinde başka bir dosya oluşturur . İçeriklerini okumamız gerekmeyeceği için dosyalar boş olabilir,
Not: Windows kullanıyorsanız, bu dosya basit dosya yapısını bir grafik dosya yöneticisi ile ayarlayın.
Son olarak, çalışmak için güzel bir arayüz sağlayan etkileşimli Python kabuğumuz olarak Ipython'u kullanacağız. Bu sadece bir metadır, bu nedenle kesinlikle gerekli değildir.
pip install ipythonBunu yaptıktan sonra, sadece ipython yazarak güzel bir Python kabuğuna erişebileceksiniz .

Artık hazırsınız, Python'da bir klasör veya dosya olup olmadığını kontrol etmenin yollarına geçelim.
Dene, Aç ve Hariç Tut
Bu en basit seçenektir. Var olmayan bir dosyayı açmaya çalışırsanız, Python bir FileNotFoundError oluşturacaktır.
In [1]: open('im-not-here.txt') --------------------------------------------------------------------------- FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'Bundan faydalanabilir ve aradığımız dosyanın olmaması durumunda istisnayı halledebiliriz.
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 existYukarıdaki kodda özel bir mesaj yazdırıyoruz ve dosya yoksa programın yürütülmesini durduruyoruz.
Exit() işlevinin yalnızca bir istisna oluşturulduğunda nasıl yürütüleceğine dikkat edin. Bakalım aradığımız dosya gerçekten var olduğunda ne olacak.
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'>Dosyayı açtıktan hemen sonra nasıl kapattığımıza dikkat edin. Python belgelerine göre iyi bir uygulama olarak kabul edilir.
<span class="pre">file.write()</span><span class="pre">with</span>anahtar sözcüğünü kullanmadan veya<span class="pre">file.close()</span>çağırmadan çağırma<span class="pre">file.close()</span>iddialarını neden olabilir<span class="pre">file.write()</span>tamamen değil bile program çıkar başarıyla diske yazılmaktadır.
Dosyaya yazmıyor olsak bile, birden çok performans sorununa yol açabileceğinden dosyayı kapatmanız şiddetle tavsiye edilir.
Dosyayı kendimiz kapatmak istemiyorsak , bağlam yöneticisini kullanabiliriz. Kaynakları tam olarak tahsis eder ve serbest bırakır, bu nedenle dosyayı kapatmamız gerekmez.
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'>Bu yöntem, dosyalara yazarken son derece kullanışlıdır, ancak yalnızca bir dosyanın var olup olmadığını kontrol etmek istersek verimsiz sonuçlanır. Bunu başarmak için diğer seçeneklere geçelim.
os.path.exists()
İşletim sistemi modülü, işletim sistemiyle etkileşim kurmak için birden fazla işlev sağlar. Bir dosya veya klasörün var olup olmadığını kontrol etmek için yolu kullanabiliriz . argüman olarak dosya veya dizine giden yolu kabul eden var() işlevi. Yolun varlığına dayalı bir boole döndürür.
Not: Yol, bir dosya sistemindeki bir dosyanın veya dizinin benzersiz konumudur.
Python'da os.path alt modülü, yalnızca dosya yollarıyla çalışmak üzere tasarlanmış işlevleri içerir. Bu işlevlerin tümü, yol bağımsız değişkenini dizeler veya baytlar olarak kabul eder ve mutlak yollarla çalışmaya karar verebilirsiniz, örneğin:
/home/daniel/.bashrcVeya komut dosyasını çalıştırdığınız dizine bağlı olarak göreceli yollarla:
.bashrc # Running the script in my home folderTest dosyalarımın bulunduğu dizinde çalışan os.path.exists() işlevini kullanan birden çok örnek:
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]: FalseGördüğünüz gibi, testfile.txt dosyası ve testdirectory klasörü ile test ederken True , dosya yokken False döndürür.
os.path.isfile()
Yalnızca bir dosyanın (bir dizinin değil) varlığını kanıtlamak istiyorsanız, os.path.isfile() işlevini çağırırsınız.
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]: TrueNot: UNIX'te tüm dizinler eğik çizgi (/) ile biter, Windows'ta ise ters eğik çizgi (\) kullanırız.

Yukarıdaki kodda isfile() işlevi iki durumda False döndürüyor , nedenini görelim:
-
testdirectory/bir dizindir, bu nedenle bir dosya olarak kabul edilmez. Linux'ta her şey bir dosya tanımlayıcı olduğundan bu kesinlikle doğru değildir, ancak Python sadece kolaylık sağlamak için dizinlere farklı davranır (Bir dizini açmaya çalışırsanız bir IsADirectoryError alırsınız ) -
i-dont-even-exist, ironik bir şekilde var olmayan bir dosyaya işaret ediyor
os.path.isdir()
Bir dizinin doğru yerde olup olmadığını kontrol etmek istiyorsanız, yalnızca verilen yol bir dizine işaret ediyorsa True döndüren os.path.isdir() işlevini kullanmanız gerekir.
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]: FalseYol var olan bir dosyaya işaret ediyor olsa bile, yukarıdaki örneklerin nasıl False döndürdüğüne dikkat edin.
Küre
Glob modülü, Unix kabuğu benzeri kalıplarla çalışmak için işlevler sağlar (bu nedenle Windows'ta düzgün çalışmaz). Bir dosyanın geçerli dizindeki bir kalıpla eşleşip eşleşmediğini kontrol etmek için glob.glob() işlevini kullanabilirsiniz.
In [1]: import glob In [2]: glob.glob('testfile.txt') Out[2]: ['testfile.txt'] In [3]: glob.glob('testdirectory') Out[3]: ['testdirectory']Yukarıdaki kodda, glob işlevine iletilen kalıp, test dosyasına ve dizinine giden yolu temsil eden normal bir dizedir. Her iki yol da mevcut olduğundan, işlev, içinde eşleşen yol adlarını içeren bir liste döndürür.
Not: Desen eşleşmediyse boş bir liste alırsınız.
Kalıpları glob işlevine geçirebileceğimizi düşünürsek, neden bunun bazı temel avantajlarını test etmeyelim?
Aşağıdaki kod, sırasıyla .txt ve .py uzantılı tüm dosya yollarını alır:
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']Yol Sınıfını Kullanma
Path sınıfı, File yollarıyla nesneler olarak çalışmak için bize temiz bir arayüz sağladığından, yollarla çalışmanın en iyi yollarından biridir.
İşin püf noktası, Path örneklerinin belirli bir yol hakkında bilgi almak için ihtiyaç duyacağınız tüm yöntemlere sahip olmasıdır. Bu, önceki seçeneklere benzer işlevleri içerir.
Not: pathlib kitaplığını kullanmak için Python 3.4 veya üstü gerekir
Kullanacağınız Path yöntemleri:
- Path().exists()
- Path().is_file()
- Yol().is_dir()
Bir yol olup olmadığını kontrol edin
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]: Trueos.path.exists() ile aynı şekilde çalışır.
Yolun bir dosyaya işaret edip etmediğini kontrol edin
In [5]: Path('testfile.txt').is_file() Out[5]: True In [6]: Path('testdirectory').is_file() Out[6]: Falseos.path.isfile() ile eşdeğerdir.
Yolun bir dizine işaret edip etmediğini kontrol edin
In [7]: Path('testfile.txt').is_dir() Out[7]: False In [8]: Path('testdirectory').is_dir() Out[8]: Trueos.path.isdir() işlevine karşılık gelir .
alt süreç
Bir alt süreç modülü sevgilisiyseniz, bu seçenek hakkında bilgi sahibi olmanız gerekir. Test komutunu kullanarak bir dosya veya klasörün var olup olmadığını belirleyebilirsiniz.
Not: test komutu yalnızca Unix'te çalışır.
Aşağıdaki test bayrakları işi tamamlayacaktır:
- test -e: Bir yol olup olmadığını kontrol edin
- test -f: Bir dosyanın olup olmadığını kontrol edin
- test-d: Bir klasör olup olmadığını kontrol edin
Daha fazla test bayrağına dalmak istemeniz durumunda, aşağıdakileri çalıştırarak kılavuzu okuyabilirsiniz:
man testAlt işlemli bir Yolu kontrol etme:
Aşağıdaki kod, alt işlemin dönüş kodunu 0 ile karşılaştırarak bir yolun olup olmadığını belirler.
Linux'ta bir işlem iyi giderse sıfır, gitmediyse başka bir kod döndüreceğini unutmayın.
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]: Falseİlk ifadede, alt süreç modülünü içe aktarıyoruz, ardından çalıştırma işlevini kullanıyoruz ve dönüş kodunu alıyoruz.
Alt işlemli bir dosyanın varlığını doğrulama
In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0 Out[4]: True In [5]: run(['test', '-f', 'testdirectory']).returncode == 0 Out[5]: FalseAlt işlemli bir dizini kontrol etme:
In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0 Out[6]: False In [7]: run(['test', '-d', 'testdirectory']).returncode == 0 Out[7]: TrueDaha fazla kaynak tükettiği için bu seçeneğin kullanılması pek önerilmez ve bundan herhangi bir avantaj elde edemeyiz.
Sonuç olarak
Python, işletim sistemi ile etkileşim kurarak süreçleri otomatikleştirmek için en çok kullanılan programlama dillerinden biridir. Bununla yapabileceğiniz harika bir şey, bir dosya veya klasör olup olmadığını kontrol etmektir.
Bunu yapmanın en basit yolu:
- Dosya istisnalarını hemen açma ve işleme
- os.path veya pathlib modüllerinin mevcut() işlevini kullanma.
Bu eğitimde şunları öğrendiniz:
- Bir dosya nasıl açılır ve mevcut olmaması durumunda istisnalar nasıl ele alınır?
- yolların anlamı
- os.path alt modülünün bir dosya veya klasörün varlığını kontrol etmek için sağladığı 3 farklı işlev
- Unix eğik çizgi (/) kullanırken Windows ters eğik çizgi (\) kullanır
Sonraki okuma: Python'da Alt İşlem Nedir? [5 Kullanım Örneği]
