7 способів перевірити, чи існує файл або папка в Python

| | 0 Comments| 1:55 PM
Categories:

Стандартна бібліотека Python містить більшість функцій, які знадобляться розробнику для вирішення проблеми. У цьому підручнику ви дізнаєтесь про різні способи перевірки існування файлу чи каталогу лише за допомогою вбудованих модулів.

Перевірка того, чи файл або сценарій знаходиться у правильному місці, є важливою для будь-якої програми CLI. Ваша програма може стати марною, якщо певний файл не буде на місці в момент виконання.

У сьогоднішньому підручнику ви дізнаєтеся про кілька швидких способів перевірити, чи існує файл або папка в Python.

Перед початком

Перш ніж виконувати будь-яку наведену нижче команду, переконайтеся, що у вашій системі встановлено Python 3. Відкрийте термінал і введіть таку команду:

python --version
# Python 3.9.5, my result

Якщо у вас версія 2.x, вам потрібно буде використати команду “python3”. Перегляньте наш посібник зі встановлення Python, якщо у вас не встановлено Python 3.

У цьому підручнику ми використовуватимемо деякі тестові файли, тому переконайтеся, що ви створили такі файли:

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

Наведені вище команди створюють файл для гри, каталог тестування та інший файл у каталозі тестування. Файли можуть бути порожніми, оскільки нам не потрібно буде читати їхній вміст,

Примітка. Якщо ви використовуєте Windows, налаштуйте просту файлову структуру цього файлу за допомогою графічного файлового менеджера.

Нарешті, ми будемо використовувати Ipython як наша інтерактивна оболонка Python, яка надає гарний інтерфейс для роботи. Це просто товар, тому не обов’язковий.

pip install ipython

Після цього ви отримаєте доступ до чудової оболонки Python, просто ввівши ipython.

Тепер усе готово, давайте зануримося в способи перевірки наявності папки чи файлу в Python.

Спробуйте, відкрийте та за винятком

Це найпростіший варіант. Якщо ви спробуєте відкрити файл, якого не існує, Python викличе a FileNotFoundError.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

Ми можемо скористатися цим і обробити виняток, якщо файл, який ми шукаємо, не існує.

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 exist

У наведеному вище коді ми друкуємо спеціальне повідомлення та зупиняємо виконання програми, якщо файл не існує.

Зауважте, що функція exit() виконуватиметься лише у разі виникнення винятку. Давайте подивимося, що станеться, коли файл, який ми шукаємо, дійсно існує.

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

Зверніть увагу, що ми закриваємо файл відразу після відкриття. Це вважається хорошою практикою згідно з Документація Python.

  Виправте помилку Model Bind на телевізорі Samsung

Виклик file.write() без використання ключового слова with або виклик file.close() може призвести до того, що аргументи file.write() не будуть повністю записані на диск, навіть якщо програма завершиться успішно.

Навіть якщо ми не пишемо у файл, дуже рекомендується закрити файл, оскільки це може призвести до численні проблеми з продуктивністю.

Якщо ми не хочемо закривати файл самостійно, ми можемо використати контекстний менеджер with. Він точно розподіляє та звільняє ресурси, тому нам не потрібно буде закривати файл.

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

Цей метод надзвичайно корисний під час запису у файли, але результат неефективний, якщо ми хочемо лише перевірити, чи існує файл. Давайте розглянемо інші варіанти досягнення цього.

os.path.exists()

The модуль os забезпечує безліч функцій для взаємодії з операційною системою. Щоб перевірити, чи існує файл або папка, ми можемо використати функцію path.exists(), яка приймає шлях до файлу чи каталогу як аргумент. Він повертає логічне значення на основі існування шляху.

Примітка. Шлях — це унікальне розташування файлу або каталогу у файловій системі

У Python, os.path Підмодуль містить функції, призначені виключно для роботи зі шляхами до файлів. Усі ці функції приймають аргумент шляху у вигляді рядків або байтів, і ви можете вирішити працювати з абсолютними шляхами, наприклад:

/home/daniel/.bashrc

Або з відносними шляхами, залежно від каталогу, у якому виконується сценарій:

.bashrc
# Running the script in my home folder

Ось кілька прикладів використання функції os.path.exists(), яка виконується в каталозі, де знаходяться мої тестові файли:

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]: False

Як бачите, він повертає True під час тестування з файлом testfile.txt і папкою testdirectory і False, коли файл не існує.

os.path.isfile()

Якби ви хотіли лише підтвердити існування файлу (а не каталогу), ви б викликали функцію 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]: True

Примітка: в UNIX усі каталоги закінчуються скісною рискою (/), тоді як у Windows ми використовуємо зворотну скісну риску ().

  14 потужних SEO API для маркетологів і компаній

У наведеному вище коді функція isfile() повертає False у двох випадках, давайте подивимося, чому:

  • testdirectory/ є каталогом, тому він не вважається файлом. Це не зовсім так, оскільки в Linux все є дескриптор файлуале Python обробляє каталоги по-різному лише для зручності (якщо ви спробуєте відкрити каталог, ви отримаєте IsADirectoryError)
  • i-dont-even-exist вказує на файл, якого за іронією долі не існує

os.path.isdir()

Якщо ви хочете перевірити, чи каталог знаходиться у правильному місці, вам потрібно буде використати функцію os.path.isdir(), яка повертає True, лише якщо заданий шлях вказує на каталог.

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]: False

Зверніть увагу, що наведені вище приклади повертають False, навіть якщо шлях вказує на існуючий файл.

Глоб

The глоб модуль надає функції для роботи Шаблони, подібні до оболонки Unix (тому він не працює належним чином у Windows). Щоб перевірити, чи файл відповідає шаблону в поточному каталозі, ви можете скористатися glob.glob() функція.

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

У наведеному вище коді шаблон, переданий у функцію glob, є звичайним рядком, який представляє шлях до тестового файлу та каталогу. Оскільки існують обидва шляхи, функція повертає список із відповідними іменами шляхів усередині нього.

Примітка. Якщо шаблон не збігається, ви отримаєте порожній список.

Враховуючи, що ми можемо передавати шаблони до функції glob, чому б не перевірити деякі з її основних переваг?

Наведений нижче код отримує всі шляхи до файлів із розширенням .txt і .py відповідно:

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

Використання класу Path

The Клас шляху це один із найкращих способів роботи зі шляхами, оскільки він дає нам чистий інтерфейс для роботи зі шляхами файлів як об’єктами.

Вишнечка торта полягає в тому, що екземпляри Path мають усі методи, необхідні для отримання інформації про певний шлях. Це включає функції, аналогічні попереднім варіантам.

Примітка. Для використання бібліотеки pathlib вам потрібен Python 3.4 або новішої версії

Методи Path, якими ви будете користуватися:

Перевірте, чи існує шлях

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]: True

Працює так само, як os.path.exists().

  Як взяти свій розумний дім у подорож

Перевірте, чи шлях вказує на файл

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

Еквівалент os.path.isfile().

Перевірте, чи шлях вказує на каталог

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

Відповідає os.path.isdir().

підпроцес

Якщо ви любитель модулів підпроцесів, вам потрібно знати про цю опцію. Ви можете визначити, чи існує файл або папка, використовуючи тестова команда.

Примітка. Команда test працює лише в Unix.

Наступні тестові позначки виконають роботу:

  • test -e: перевірити, чи існує шлях
  • test -f: перевірити, чи існує файл
  • test-d: перевірити, чи існує папка

Якщо ви хочете зануритися в інші тестові позначки, ви можете прочитати посібник, виконавши:

man test

Перевірка шляху з підпроцесом:

Наведений нижче код визначає, чи існує шлях, порівнюючи код повернення підпроцесу з 0.

Пам’ятайте, що в Linux, якщо процес пройшов добре, він поверне нуль, якщо ні, поверне будь-який інший код.

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

У першому операторі ми імпортуємо модуль підпроцесу, а потім використовуємо функція запуску і отримати його код повернення.

Перевірка існування файлу з підпроцесом

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0
Out[4]: True

In [5]: run(['test', '-f', 'testdirectory']).returncode == 0
Out[5]: False

Перевірка каталогу з підпроцесом:

In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0
Out[6]: False

In [7]: run(['test', '-d', 'testdirectory']).returncode == 0
Out[7]: True

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

Підсумовуючи

Python є однією з найбільш використовуваних мов програмування для автоматизації процесів шляхом взаємодії з ОС. Одна цікава річ, яку ви можете зробити з ним, це перевірити, чи існує файл або папка.

Найпростіше це зробити:

  • Миттєве відкриття та обробка винятків файлів
  • Використання функції exists() модулів os.path або pathlib.

У цьому посібнику ви дізналися:

  • Як відкрити файл і обробити винятки, якщо він не існує
  • Значення стежок
  • Підмодуль os.path надає 3 різні функції для перевірки існування файлу чи папки
  • В Unix використовуються скісні риски (/), а в Windows — зворотні скісні риски ()

Далі читайте: Що таке підпроцес у Python? [5 Usage Examples]