Описанные ниже методы позволяют произвести рекурсивный обход дерева каталога и получить список файлов средствами модуля pathlib
. Данные методы принадлежат экземпляру, созданному из класса Path()
.
Так как класс pathlib.Path()
наследуется от класса pathlib.PurePath()
, следовательно он поддерживает все операции по манипуляции с путями файловой системы.
Path.glob()
и Path.rglob()
с модулем glob
в PythonPath.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()
- рекурсивный обход каталога как в глубину, так и из глубины.