Есть довольно много способов решить проблему в программировании, и это особенно актуально для Python . Часто вы обнаружите, что несколько встроенных или стандартных модулей служат, по сути, одной цели, но с немного различающейся функциональностью. Проверка наличия файла или каталога с помощью Python, безусловно, является одним из таких случаев.
Вот несколько способов проверить существующие файлы / каталоги и их нюансы. В этих примерах мы предполагаем, что в нашем текущем рабочем каталоге есть следующие файлы и каталоги:
drwxr-xr-x 3 scott staff 102 Jan 12 10:01 dir
-rw-r--r-- 1 scott staff 5 Jan 12 09:56 file.txt
lrwxr-xr-x 1 scott staff 8 Jan 12 09:56 link.txt -> file.txt
lrwxr-xr-x 1 scott staff 3 Jan 12 10:00 sym -> dir
Обратите внимание, что у нас есть один каталог ( dir
), один файл (
file.txt
), одна символическая ссылка на файл ( link.txt
) и одна
символическая ссылка на каталог ( sym
).
Проверка существования файла
Это, пожалуй, самый простой способ проверить, существует ли и файл, и файл.
import os
os.path.isfile('./file.txt') # True
os.path.isfile('./link.txt') # True
os.path.isfile('./fake.txt') # False
os.path.isfile('./dir') # False
os.path.isfile('./sym') # False
os.path.isfile('./foo') # False
Обратите внимание , что
os.path.isfile
делает последующие символьные ссылки, так что мы получаем True
при
проверке link.txt
.
isfile
на самом деле является просто вспомогательным методом, который
внутри использует os.stat
и stat.S_ISREG(mode)
ниже, о чем мы
поговорим позже.
Проверка существования каталога
Как и метод isfile
os.path.isdir
- это самый простой способ
проверить, существует ли каталог или является ли указанный путь
каталогом.
import os
os.path.isdir('./file.txt') # False
os.path.isdir('./link.txt') # False
os.path.isdir('./fake.txt') # False
os.path.isdir('./dir') # True
os.path.isdir('./sym') # True
os.path.isdir('./foo') # False
Опять же, как и isfile
,
os.path.isdir
следует символическим ссылкам. Это также простая оболочка для os.stat
и stat.S_ISDIR(mode)
, поэтому вы не получите от нее ничего, кроме
удобства.
Проверка, существует ли какой-либо из них
Другой способ проверить, существует ли путь (если вам все равно,
указывает ли путь на файл или каталог), - использовать os.path.exists
.
import os
os.path.exists('./file.txt') # True
os.path.exists('./link.txt') # True
os.path.exists('./fake.txt') # False
os.path.exists('./dir') # True
os.path.exists('./sym') # True
os.path.exists('./foo') # False
Как видите, его не волнует, указывает ли путь на файл, каталог или
символическую ссылку, так что это почти как если бы вы использовали
isfile(path) or isdir(path)
. Но на самом деле внутри он просто
пытается вызвать os.stat(path)
, и если возникает ошибка, он
возвращает False
.
Передовой
На протяжении всей статьи я упоминал, как все вышеперечисленные методы
используют
os.stat
, поэтому
решил, что было бы полезно взглянуть на него. Это метод более низкого
уровня, который предоставит вам подробную информацию о файлах,
каталогах, сокетах, буферах и многом другом.
Как и все другие методы, которые мы уже рассмотрели, os.stat
следует
символическим ссылкам, поэтому, если вы хотите получить статистическую
информацию по ссылке, попробуйте вместо этого os.lstat()
Поскольку все операционные системы разные, данные, предоставляемые
os.stat
сильно различаются. Вот лишь некоторые из данных, которые
являются общими для каждой ОС:
st_mode
: биты защитыst_uid
: идентификатор пользователя владельцаst_gid
: идентификатор группы владельцаst_size
: размер файла в байтахst_atime
: время последнего доступаst_mtime
: время последней модификацииst_ctime
: время последнего изменения метаданных в Unix или время создания в Windows
Затем вы можете использовать эти данные с stat
для получения
интересной информации, например, указывает ли путь на сокет (
stat.S_ISSOCK(mode)
) или действительно ли файл является именованным
каналом ( stat.S_ISFIFO(mode)
).
Если вам нужны более продвинутые функции, тогда вам следует пойти сюда.
Но в 90% случаев, когда вы имеете дело с каталогами и файлами, os.path
должны os
или os.path.
Хотя один допустимый вариант использования может быть, когда вы выполняете несколько тестов в одном файле и хотите избежать накладных расходов на системный вызов stat для каждого теста. Так что, если вам нужно сделать несколько тестов, это поможет вам сделать это более эффективно.