如何从 Pathlib glob('**')

问题描述

我使用 python pathlib Path.glob('**') 递归获取主目录和所有子目录。但我不想要隐藏目录。我的代码看起来像这样

from pathlib import Path

p = Path(a_path)
p.glob('**')

我想要的可以通过glob这样实现

glob.glob(os.path.join(a_path,'**/'),recursive=True)

但我很好奇如何用pathlib

达到同样的效果

解决方法

pathlibglob 版本不会过滤隐藏的文件和目录,因此您必须自己检查它们。由于它返回所有条目,因此您必须分别检查每个部分(路径组件):

[path for path in p.glob('**') if not any(part.startswith('.') for part in path.parts)]

这有几个问题:对于大型隐藏目录来说效率低下,因为你不能一次删除它们,你必须过滤掉它们的每个子文件夹。如果您的起始文件夹的任何部分被隐藏,它也不会起作用,除非您在 if 检查中将其切断。

另一种方法是使用 os.walk(),它允许您在下降发生时修改下降,如 this answer 中所述。

这一切都假设您使用的是 *nix,其中隐藏状态通过在名称前添加一个点来表示。在 Windows 上,您可能不得不求助于 attrib 等外部工具。