Сообщить об ошибке.

Объект DirEntry() модуля os в Python

Пути к файлу и другие атрибуты файла os.scandir()

Синтаксис:

import os

os.DirEntry

dirent = os.scandir(path)

Описание:

Объект DirEntry() модуля os является результатом работы функции os.scandir(). Методы объекта DirEntry() предоставляют пути к файлу и другие атрибуты файлов, расположенных в сканируемом каталоге.

Функция os.scandir() предоставит как можно больше этой информации без дополнительных системных вызовов. Когда выполняется системный вызов stat() или lstat(), объект os.DirEntry будет кэшировать результат.

Экземпляры os.DirEntry не предназначены для хранения в долгоживущих структурах данных, если вы знаете, что метаданные файла изменились или прошло много времени с момента вызова os.scandir(), вызовите os.stat(entry.path) для получения актуальной информации.

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

Для использования пути к файлам в качестве объекта os.DirEntry реализует интерфейс os.PathLike.

Атрибуты и методы экземпляра os.DirEntry:

dirent.name:

Атрибут name это базовое имя файла записи относительно аргумента пути функции os.scandir().

Атрибут name будет байтовым, если аргумент пути os.scandir() имеет тип bytes и строковым в противном случае. Используйте os.fsdecode() для декодирования байтовых имен файлов.

dirent.path:

Атрибут path это полный путь к элементу в каталоге: эквивалент os.path.join(scandir_path, entry.name), где scandir_path - аргумент пути функции os.scandir(). Путь является абсолютным, только если аргумент пути os.scandir() был абсолютным. Если аргумент пути os.scandir() был дескриптором файла, то атрибут пути path будет совпадает с атрибутом имени name.

Атрибут path будет байтовым, если аргумент пути os.scandir() имеет тип bytes и строковым в противном случае. Используйте os.fsdecode() для декодирования байтовых имен файлов.

dirent.inode():

Метод inode() вернет номер индекса записи. Результат кэшируется в объекте os.DirEntry. Используйте os.stat(entry.path, follow_symlinks=False).st_ino для получения актуальной информации.

При первом не кэшированном вызове системный вызов требуется в Windows, но не в Unix.

dirent.is_dir(*, follow_symlinks=True):

Метод is_dir() вернет True, если эта запись является каталогом или символической ссылкой, указывающей на каталог. Вернет False, если запись соответствует или указывает на любой другой тип файла или если каталог больше не существует.

Если follow_symlinks=False, то вернет True только если запись является каталогом, а не символической ссылкой на каталог. Вернет False, если запись представляет собой файл любого другого типа или каталог больше не существует.

Результат кэшируется в объекте os.DirEntry, с отдельным кэшем для follow_symlinks True и False. Вызовите os.stat() вместе с функцией тестирования stat.S_ISDIR(), чтобы получить актуальную информацию.

При первом вызове без кэширования в большинстве случаев не требуется системный вызов, за исключением некоторых файловых систем Unix, таких как сетевые файловые системы, которые возвращают entry.d_type == DT_UNKNOWN. Если запись является символической ссылкой и follow_symlinks=True, то системный вызов должен следовать по символической ссылке.

Этот метод может вызвать исключение OSError, например PermissionError, но исключение FileNotFoundError перехватывается и не вызывается.

dirent.is_file(*, follow_symlinks=True):

Метод is_file() вернет True, если эта запись является файлом или символической ссылкой, указывающей на файл. Вернет False, если запись является или указывает на каталог или другую нефайловую запись, или если она больше не существует.

Если follow_symlinks=False, возвращать True только если эта запись является файлом, а не символической ссылкой, указывающей на файл. Вернет False, если запись является каталогом или другой нефайловой записью, или если она больше не существует.

Результат кэшируется в объекте os.DirEntry. Кэширование, системные вызовы и создаваемые исключения соответствуют методу entry.is_dir().

dirent.is_symlink():

Метод is_symlink() вернет True, если эта запись является символической ссылкой, даже если она не работает. Вернет False, если запись указывает на каталог или какой-либо файл, или если символическая ссылка больше не существует.

Результат кэшируется в объекте os.DirEntry. Вызовите os.path.islink() для получения актуальной информации.

При первом вызове без кэширования в большинстве случаев не требуется системный вызов, за исключением некоторых файловых систем Unix, таких как сетевые файловые системы, которые возвращают dirent.d_type == DT_UNKNOWN.

Этот метод может вызвать исключение OSError, например PermissionError, но исключение FileNotFoundError перехватывается и не вызывается.

dirent.is_junction():

Новое в версии Python 3.12.

Метод is_junction() возвращает True, если эта запись является соединением (даже если она повреждена); возвращает значение False, если запись указывает на обычный каталог, любой файл, символическую ссылку или если она больше не существует.

Результат кэшируется в объекте os.DirEntry. Чтобы получить актуальную информацию, необходимо вызвать os.path.isjunction().

dirent.stat(*, follow_symlinks=True):

Метод stat() вернет объект os.stat_result для этой записи. Метод следует по символическим ссылкам по умолчанию, чтобы не переходить по символическим ссылкам, добавьте аргумент follow_symlinks=False.

В Unix, метод stat() всегда требует системного вызова. В Windows системный вызов требуется только в том случае, если follow_symlinks имеет значение True, а запись является точкой повторной обработки, например символическая ссылка или ссылка каталога.

В Windows атрибуты os.stat_result.st_ino, os.stat_result.st_dev и os.stat_result.st_nlink всегда устанавливаются на ноль. Вызовите os.stat(), чтобы получить эти атрибуты.

Результат кэшируется в объекте os.DirEntry, с отдельным кэшем для follow_symlinks True и False. Вызовите os.stat(), чтобы получить актуальную информацию.

Обратите внимание, что существует хорошее соответствие между несколькими атрибутами и методами os.DirEntry и pathlib.Path. В частности, атрибут name имеет то же значение, что и методы entry.is_dir(), entry.is_file(), entry.is_symlink() и entry.stat().


Изменено в версии Python 3.12: Атрибут stat_info.st_ctime результата stat в Windows устарел. Время создания файла должным образом доступно как stat.st_birthtime, и в будущем stat.st_ctime может быть изменено (будет возвращать ноль или время изменения метаданных, если доступно).

Примеры использования:

Функция os.scandir() возвращает последовательность экземпляров os.DirEntry для элементов в каталоге. Объект os.DirEntry имеет несколько атрибутов и методов для доступа к метаданным о файле. В этом примере будет осуществлен вывод элементов каталога path и его типа в файловой системе.

import os
import sys

path = '.'
t = 'unknown'
for entry in os.scandir(path):
    if entry.is_dir():
        t = 'dir'
    elif entry.is_file():
        t = 'file'
    elif entry.is_symlink():
        t = 'link'

    print(f'{entry.name} {t}')