Python 用于目录搜索的 rglob 模式

Python rglob pattern for directory search

我尝试在 Windows10 上使用 Python3 脚本获取子目录的名称。 于是,我写了如下代码:

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参数的模式returns会这样。

谁能解释一下?

谢谢。

posix 风格的文件系统中的每个目录都有两个文件:..,指的是父目录,.,指的是当前目录目录:

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

- 值得注意的例外是 /..,它指的是根本身,因为根没有父代。

来自 python 的 pathlibPath 对象在创建时只是一个字符串包装器,该字符串假定指向文件系统中的某处。它只会在 解决:

时提及有形的东西
>>> 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 解决后也会反映出来[=44​​=]

通过将 glob 调用与 . 相匹配,您发现所有指向初始目录下当前目录的链接。 glob 的结果在 return 得到解决,因此 . 不再出现。

作为此行为的来源,请参阅 PEP428 的 this section(作为 pathlib 的规范),其中简要提到了路径等效性。