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

Есть довольно много способов решить проблему в программировании, и это особенно актуально для Python [/ why-beginners-should-learn-python /]. Часто вы обнаружите, что несколько встроенных или стандартных модулей служат, по сути, одной цели, но с немного различающейся функциональностью. Проверка наличия файла или каталога с помощью Python, безусловно, является одним из таких случаев. Вот несколько способов проверить существующие файлы / каталоги и их нюансы. В этих примерах мы будем предполагать, что наша валюта

Есть довольно много способов решить проблему в программировании, и это особенно актуально для 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 для каждого теста. Так что, если вам нужно сделать несколько тестов, это поможет вам сделать это более эффективно.

comments powered by Disqus