Стандартна бібліотека 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.
Виклик 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 ми використовуємо зворотну скісну риску ().
У наведеному вище коді функція 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]