7 способов проверить, существует ли файл или папка в Python
Опубликовано: 2021-06-16Стандартная библиотека 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 вызовет 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, это считается хорошей практикой.
Вызов
<span class="pre">file.write()</span>без использования<span class="pre">with</span>ключевым словом<span class="pre">with</span>или вызов<span class="pre">file.close()</span>может привести к тому, что аргументы<span class="pre">file.write()</span>не будут полностью записаны на диск, даже если программа завершится успешно.
Даже если мы не записываем в файл, настоятельно рекомендуется закрыть файл, поскольку это может привести к множественным проблемам с производительностью.
Если мы не хотим закрывать файл сами, мы могли бы использовать with context manager. Он точно выделяет и высвобождает ресурсы, поэтому нам не нужно закрывать файл.
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 ()
Модуль os предоставляет несколько функций для взаимодействия с операционной системой. Чтобы проверить, существует ли файл или папка, мы можем использовать путь. Функция 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Как вы можете видеть, он возвращает Правда при тестировании с файлом 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, даже если путь указывает на существующий файл.
Glob
Модуль glob предоставляет функции для работы с шаблонами, подобными оболочке 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 - один из лучших способов работы с путями, поскольку он дает нам чистый интерфейс для работы с путями к файлам как объектами.
Изюминкой торта является то, что у экземпляров Path есть все методы, которые могут понадобиться для получения информации об определенном пути. Это включает в себя функции, аналогичные предыдущим параметрам.
Примечание. Для использования библиотеки pathlib вам понадобится Python 3.4 или выше.
Методы Path, которые вы будете использовать:
- Путь (). Существует ()
- Путь (). Is_file ()
- Путь (). Is_dir ()
Проверить, существует ли путь
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В первом операторе мы импортируем модуль подпроцесса, затем используем функцию run и получаем ее код возврата.
Проверка наличия файла с подпроцессом
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 примеров использования]
