Как проверить, существует ли файл, при помощи Python

Работа с файлами – неотъемлемая составляющая взаимодействия с любым приложением с мало-мальски нормальным функционалом. И стандартная библиотека Python предоставляет возможность проверить файл на наличие в файловой системе.

В каких случаях это может пригодиться? Например, когда вы хотите удостовериться, что файл с данными доступен. Второй вариант – это профилактика того, чтобы файл не был записан повторно. Хотя функционал, который будет рассмотрен далее, может касаться и папок.

В Python есть несколько вариантов, как можно поступать, чтобы подтвердить наличие папки или файла, пользуясь внедренными в ядро возможностями.

Сегодня мы разберем три специальные техники. Они используются разработчиками для того того, чтобы проверить, есть ли нужный файл, с помощью средств Python. Также мы приведем примеры кода и конкретные преимущества и недостатки. Заранее скажем, что лучшей или худшей нет. Они просто подходят для разных ситуаций. Да и просто необходимо уметь читать код. Поэтому изучить их придется.

Проверка наличия файла с помощью os.path.exists() и os.path.isfile()

Чаще всего для определения наличия файла используются методы exists() и isfile(), которые находятся в модуле os.path. Поскольку он находится в стандартной библиотеке, его не нужно дополнительно устанавливать.

Воспользоваться этими возможностями можно в Python 2 и Python 3.7. Как правило, их именно эти версии рекомендуют в первую очередь для проверки существования файлов.

Какая же функция самая простая для работы с файлами? Конечно же, exists(). Она содержит всего один аргумент – путь файла. Работа с функцией os.path.exists() осуществляется следующим образом. 

import os.path

 

check_file = os.path.exists('storage/music.mp3') # True

print(os.path.exists('нет-такого-файла.txt')) # False

 

# Проверяем если папка существует.

os.path.exists('storage') # True

Здесь мы проверили несколько путей на наличие. Как мы видим, мы получили True для файлов и папок с помощью этого вызова. Если вы хотите удостовериться, что этот путь указывает на файл, а не на папку, тогда можно воспользоваться функцией os.path.isfile(). Она по легкости ничуть не уступает предыдущей. 

import os.path

 

os.path.isfile('storage/music.mp3') # True

os.path.isfile('нет-такого-файла.txt') # False

os.path.isfile('storage') # False, папка существует но это не файл.

Для всех функций необходимо учитывать то, что они анализируют лишь существование файла. Доступ приложения к нему не проверяется. Поэтому если обязательно убедиться в том, что приложение может открывать файл и работать с ним, достаточно просто осуществить его открытие, а потом обработать исключение IOError.

К данной технике мы обратимся немного позже. А сейчас попробуем рассмотреть еще один способ.

Использование функции open() параллельно с try … except

Ранее мы рассмотрели, какие функции в модуле os.path могут использоваться для проверки наличия файла или папки. Есть еще одна последовательность действий, позволяющая проверить факт существования файла. Можно лишь попробовать использовать функцию open(), чтобы открыть его. Если это не получится сделать, то, соответственно, его не существует. 

open('нет-такого-файла.txt')

    FileNotFoundError:

"[Errno 2] No such file or directory: 'нет-такого-файла.txt'"

Если файл в наличии, то он откроется без проблем. Функция open() вернет валидный объект для того, чтобы осуществлять последующую обработку файла. Если же его нет, то появится ошибка, приведенная в коде выше (то есть, FileNotFoundError). 

Эта ошибка всплывает в случаях, когда оказалось, что найти требуемый объект не получилось. С высокой долей вероятности это означает, что он отсутствует вообще.

Следовательно, данная ошибка может использоваться для того, чтобы проверить наличие файла. Вот пример кода, который показывает принцип работы этой техники. 

try:

    f = open('нет-такого-файла.txt')

    f.close()

except FileNotFoundError:

    print('Файл не существует!')

Обратите внимание, что нами мгновенно был вызван метод close() для объекта файла для того, чтобы освободить дескриптор файла. В процессе работы с файлами Python рекомендуется поступать именно таким образом.

Если вы решите не закрывать дескриптор файлов, то станет непросто разобраться в том, когда конкретно он будет закрыт при работе приложения. Известно лишь то, что он будет закрыт автоматически. Поскольку на это уходит часть ресурсов компьютера, это негативно влияет на итоговую эффективность программ, которые работают на этом ПК.

Вместо закрытия файла с использованием метода close(), есть еще один вариант действий. Как вариант возможно использовать контекстный менеджер, а также оператор with, чтобы осуществить процедуру автоматического назакрытия.

Теперь, аналогичная техника «лишь попытаемся открыть файл» тоже работает для того, чтобы понять, возможно ли прочитать этот файл.

Вместо того, чтобы осуществлять поиск ошибки FileNotFoundError, можно искать любые ошибки типа IOError. С высокой долей вероятности, среди них будет и та ,которая свидетельствует об отсутствии файла.  

try:

    f = open('new-music.mp3')

    f.close()

except IOError:

    print('Файл недоступен')

print('Файл доступен')

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

def is_accessible(path, mode='r'):

    """

    Проверка, является ли файл или папка из `path`

    доступным для работы в предоставленным `mode` формате.

    """

    try:

        f = open(path, mode)

        f.close()

    except IOError:

        return False

    return True

В качестве альтернативы, можно применять функцию os.access(). Чтобы ею воспользоваться, никаких дополнительных модулей устанавливать не нужно. Она доступна непосредственно в стандартной библиотеке.

С помощью функции os.access() можно проверить факт существования файла и его доступность. Это похоже на использование функции path.exists(), если файл есть в наличии. 

Использование open() и try … except имеет ряд положительных сторон, когда речь идет об обработке файлов в Python. Это позволяет не допустить сложностей, связанных с какими-то условиями наличия файла.

Допустим, что файл есть в наличии в тот момент, когда проверка с помощью нашего приложения запускается, но файл удаляется другой программой, на которую вы не влияете. Когда вы делаете попытки открыть файл, он попросту пропадает, а приложение получает ошибку.

Давайте еще один вариант действий проанализируем.

Пример проверки существования файла pathlib.Path.exists()

Python 3.4 и выше включает модуль pathlib, представляющий объектно-ориентированную среду для работы с путями файлов и папок. Это значительно лучше, чем работать с путями в форме объектов строк. 

Модуль предоставляет абстракции и дополнительные функции для большого количества операций с файловыми системами. Сюда входит, например, проверка на существование файла, а также проверка того, указывает ли путь на файл либо папку.

Чтобы проверить, ведет ли путь к этому файлу, можно воспользоваться методом Path.exists(). А чтобы узнать, не является ли путь файлом или символической ссылкой, тогда надо воспользоваться методом Path.is_file().

Вот пример, как это все работает. 

import pathlib

 

path = pathlib.Path('music.mp3')

print(path.exists()) # True

print(path.is_file()) # True

Как можно видеть с этого примера, данный подход чем-то напоминает проверку с использованием функций из модуля os.path.

Существенное отличие в том, что pathlib предоставляет более чистую объектно-ориентированную среду для взаимодействия с файловой системой. Больше нет необходимости взаимодействовать с объемами str, которые представляют пути файлов. Напротив, необходимо лишь обрабатывать объекты Path с релевантными методами и атрибутами, имеющими связь с ними.

Задействование pathlib и положительные стороны объектно-ориентированного интерфейса способны значительно увеличить читаемость и понятность кода. Но не будем говорить о том, что это средство от всех бед. Конечно, всех проблем это не решает, но помогает существенно улучшить код.

Модуль pathlib может быть использован в качестве стороннего модуля с бэкпортом для PyPI, работающего на Python 2.x и 3.x.

Выводы

Итак, мы сопоставили три различных метода для определения существования или отсутствия файла на флешке или жестком диске. Один из методов дает возможность проверить, действительно ли есть в наличии файл и является ли он доступным  тогда же.

Естественно, имея в наличии три метода выполнения одной и той же задачи, вы можете подумать, о том, какой из них лучше. В подавляющем числе случаев, при необходимости проверки существования файла, рекомендуется использовать метод pathlib.Path.exists() на Python 3.4 и выше, либо функцию os.path.exists() для Python 2 версии.

Правда, есть один важный нюанс. Не стоит забывать, файл, который считается имеющимся в наличии, может из других программ просто исчезнуть после того, как будет выполнена проверка. Конечно, это событие не имеет такую высокую вероятность, чтобы она была критической. Тем не менее, такое бывает. 

Чтобы не допустить их, не нужно проверять существование файла. Хорошо просто попытаться сразу выполнить операцию, которую нужно. Этот принцип называется «проще просить прощения, чем разрешения» и очень часто рекомендуется специалистами по Python новичкам.

Так, вместо проверки существования файла перед тем, как его открыть, гораздо лучше попробовать его открыть. И если появляется ошибка FileNotFoundError, то это говорит о недоступности файла. Это дает возможность не допустить состояния гонки.

Итак, если вам нужно работать с файлом непосредственно после проверки (например, внести какую-то информацию в него), то рекомендуется пользоваться методом open() для того, чтобы выполнить проверку, а потом просто обработать возникшие исключения.

ОфисГуру
Adblock
detector