用于目录搜索的Python rglob模式

时间:2018-08-31 07:54:56

标签: python python-3.x pathlib

我尝试在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参数的模式返回此重用。

有人可以解释吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

posix样式文件系统中的每个目录从一开始就具有两个文件:..(引用父目录)和.(引用当前目录)

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

-除了/..例外,它是指根本身,因为根没有父级。

Python Path中的pathlib对象在创建时只是一个字符串的包装,该包装被认为指向文件系统中的某处。它只会在已解析

时引用有形的东西:
>>> Path('.')
PosixPath('.')  # just a fancy string
>>> Path('.').resolve()
PosixPath('/current/working/dir')  # an actual point in your filesystem

最重要的是

  • 从文件系统的角度来看,路径/current/working/dir/current/working/dir/.是完全等效的,并且
  • pathlib.Path也会在解决后立即反映出来。

通过将glob调用与.匹配,您找到了指向初始目录下所有当前目录的链接。 glob的结果将在返回时得到解析,因此.不再显示在那里。

有关此行为的信息,请参阅PEP428的this section(用作pathlib的规范),其中简要提到了路径等效。