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

Рекурсивное получение имен файлов по шаблону из дерева каталогов

Описанные ниже методы позволяют произвести рекурсивный обход дерева каталога и получить список файлов средствами модуля pathlib. Данные методы принадлежат экземпляру, созданному из класса Path().

Так как класс pathlib.Path() наследуется от класса pathlib.PurePath(), следовательно он поддерживает все операции по манипуляции с путями файловой системы.

Содержание:


Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False):

Метод Path.glob() возвращает список всех файлов любого типа, соответствующий заданному шаблону pattern, расположенных в каталоге, указанном в пути path.

>>> from pathlib import Path
>>> paths = sorted(Path('.').glob('*.py'))
>>> paths
# [PosixPath('pthlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]

# преобразуем в список строк
list(map(str, paths))
# ['pthlib.py', 'setup.py', 'test_pathlib.py']

>>> path = sorted(Path('.').glob('*/*.py'))
>>> path
# [PosixPath('docs/conf.py')]

# что бы преобразовать объект PosixPath в строку
# просто передайте его в функцию str()
>>> str(path)
# 'docs/conf.py'

Шаблоны pattern те же, что и для fnmatch, с добавлением "**", что означает "этот каталог и все подкаталоги рекурсивно". Другими словами, шаблон '**' указывает на рекурсивный обход каталога в глубину, указанного в пути path, и всех его подкаталогов:

Дополнительно смотрите материал "Справка по языку шаблонов операционной системы"

>>> from pathlib import Path
>>> paths = sorted(Path('.').glob('**/*.py'))
>>> paths
# [PosixPath('build/lib/pathlib.py'),
#  PosixPath('docs/conf.py'),
#  PosixPath('pathlib.py'),
#  PosixPath('setup.py'),
#  PosixPath('test_pathlib.py')]

# преобразуем в список строк
>>> list(map(str, paths))
# ['build/lib/pathlib.py',
# docs/conf.py,
# pathlib.py,
# 'setup.py'
# 'test_pathlib.py']

Примечание. Использование шаблона '**' в больших деревьях каталогов может занять слишком много времени.

По умолчанию или когда для ключевого аргумента recurse_symlinks установлено значение False, то этот метод следует за символическими ссылками, за исключением случаев расширения подстановочных знаков **. Установите для recurse_symlinks значение True, чтобы всегда переходить по символическим ссылкам.

Изменено в Python 3.11: возвращает только каталоги, если шаблон pattern заканчивается разделителем компонентов пути (os.sep или os.altsep).

Изменено в версии Python 3.12: Добавлен ключевой аргумент case_sensitivity. По умолчанию или когда аргументу case_sensitive присвоено значение None, этот метод сопоставляет пути, используя правила оформления, зависящие от конкретной платформы: как правило, с учетом регистра в POSIX и без учета регистра в Windows. Чтобы переопределить такое поведение, необходимо установить значение case_sensitive равным True или False.

Изменено в Python 3.13: добавлен аргумент recurse_symlinks.

Изменено в Python 3.13: аргумент pattern принимает объект, подобный пути.

Изменено в Python 3.13: Любые исключения OSError, возникающие при сканировании файловой системы, подавляются. В предыдущих версиях такие исключения подавлялись во многих случаях, но не во всех.

Path.rglob(pattern, *, case_sensitive=None, recurse_symlinks=False):

Метод Path.rglob() работает подобно вызову метода Path.glob() с добавлением конструкции '**/' перед заданным относительным шаблоном pattern, тем самым по умолчанию производит рекурсивный поиск файлов, соответствующих pattern:

Дополнительно смотрите материал "Справка по языку шаблонов операционной системы"

>>> from pathlib import Path
>>> sorted(Path().rglob("*.py"))
# [PosixPath('build/lib/pathlib.py'),
#  PosixPath('docs/conf.py'),
#  PosixPath('pathlib.py'),
#  PosixPath('setup.py'),
#  PosixPath('test_pathlib.py')]

Изменено в версии Python 3.11: возвращает только каталоги, если шаблон pattern заканчивается разделителем компонентов пути (os.sep или os.altsep).

Изменено в версии Python 3.12: Добавлен ключевой аргумент case_sensitivity. По умолчанию или когда аргументу case_sensitive присвоено значение None, этот метод сопоставляет пути, используя правила оформления, зависящие от конкретной платформы: как правило, с учетом регистра в POSIX и без учета регистра в Windows. Чтобы переопределить такое поведение, необходимо установить значение case_sensitive равным True или False.

Изменено в Python 3.13: добавлен аргумент recurse_symlinks.

Изменено в Python 3.13: аргумент pattern принимает объект, подобный пути.

Path.iterdir():

Метод Path.iterdir() вернет итератор объектов пути содержимого каталога, если путь path указывает на каталог:

>>> from pathlib import Path
>>> p = Path('docs')
>>> for child in p.iterdir(): str(child)
...
# 'docs/conf.py'
# 'docs/_templates'
# 'docs/make.bat'
# 'docs/index.rst'
# 'docs/_build'
# 'docs/_static'
# 'docs/Makefile'

Смотрите другие методы и свойства, доступные экземпляру класса Path() модуля pathlib.

Сравнение Path.glob() и Path.rglob() с модулем glob в Python

Принимаемые шаблоны и результаты, генерируемые Path.glob() и Path.rglob(), немного отличаются от результатов модуля glob:

  • Файлы, начинающиеся с точки, не являются особенными в pathlib. Это похоже на передачу include_hidden=True в glob.glob().
  • Компоненты шаблона '**' в pathlib всегда рекурсивны . Это поведение похоже на передачу аргумента recursive=True в glob.glob().
  • Компоненты шаблона '**' в pathlib по умолчанию не следуют символическим ссылкам. Это поведение не имеет эквивалента в glob.glob(), но можно передать recurse_symlinks=True в Path.glob() для совместимого поведения.
  • Как и все объекты PurePath и Path, значения, возвращаемые функциями Path.glob() и Path.rglob(), не содержат в конце косых черт.
  • Значения, возвращаемые из Path.glob() и Path.rglob() библиотеки pathlib, включают путь в качестве префикса, в отличие от результатов glob.glob(root_dir=path).
  • Значения, возвращаемые из Path.glob() и Path.rglob() библиотеки pathlib, могут включать в себя сам путь, например, при подстановке '**', тогда как результаты glob.glob(root_dir=path) никогда не включают пустую строку, которая бы соответствовала к пути.

Дополнительно смотрите:

  • os.listdir() - список файлов в директории/каталоге,
  • os.scandir() - информация о всех файлах в каталоге/директории,
  • glob.glob() - рекурсивный поиск файлов по шаблону,
  • os.walk() - рекурсивный обход каталога как в глубину, так и из глубины.