Шаблон Python rglob для поиска в каталоге - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь получить имя подкаталогов с помощью скрипта Python3 на Windows10. Таким образом, я написал код следующим образом:

from pathlib2 import Path
p = "./path/to/target/dir"
[str(item) for item in Path(p).rglob(".")]
# obtained only subdirectories path names including target directory itself.

Это хорошо для меня, чтобы получить этот результат, но я не знаю, почему шаблон аргумента rglob возвращает этот результат.

Может кто-нибудь объяснить это?

Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Каждый каталог в файловой системе в стиле posix содержит два файла с самого начала: .., который ссылается на родительский каталог, и ., который ссылается на текущий каталог:

$ mkdir tmp; cd tmp
tmp$ ls -a
. ..
tmp$ cd .
tmp$  # <-- still in the same directory

- с заметным исключением /.., которое относится к самому корню, так как корень не имеет родителя.

Объект Path из pathlib Python - это, когда он создается, просто оболочка вокруг строки, которая, как предполагается, указывает где-то в файловой системе. Это будет относиться только к чему-то материальному, когда оно разрешено :

>>> Path('.')
PosixPath('.')  # just a fancy string
>>> Path('.').resolve()
PosixPath('/current/working/dir')  # an actual point in your filesystem

Суть в том, что

  • пути /current/working/dir и /current/working/dir/., с точки зрения файловой системы, полностью эквивалентны, и
  • a pathlib.Path также будет отражать это, как только будет решено.

Сопоставив вызов glob с ., вы нашли все ссылки, указывающие на текущие каталоги ниже исходного каталога. Результаты из glob разрешаются по возвращении, поэтому . там больше не появляется.

В качестве источника этого поведения см. этот раздел PEP428 (который служит в качестве спецификации для pathlib), где кратко упоминается эквивалентность пути.

...