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}')