使用pathlib.Path如何高效判断某目录是否为另一目录的任意层级子目录
Path判断子目录的最优实现方案
你原来转字符串比较的写法有明显漏洞,pathlib提供了原生且更可靠的判断方式,完全不需要做类型转换。
核心判断逻辑替换
适配Python 3.9及以上版本
直接用pathlib原生的is_relative_to()方法,专门用于判断目标路径是否是另一个路径的任意层级子目录:
if dir2.is_relative_to(dir1):
兼容Python 3.8及更低版本
通过Path的parents属性判断,parents会按层级返回路径的所有上级目录:
if dir1 in dir2.parents:
原字符串写法的隐患
- 路径名相似导致误判:例如
dir1 = Path('/a/b')、dir2 = Path('/a/bc/d'),转字符串后startswith会错误返回True,实际两者无父子目录关系 - 路径未规范化时判断失效:如果路径包含
./、../、多余斜杠等格式问题,字符串比较会出错,原生方法会自动完成路径规范化处理
修改后的完整代码
from pathlib import Path mydirs = [Path('/a/a/a/a'), Path('/a/a/'), Path('/a/b/'), Path('/a/a/b'), Path('/b/a/a/'), Path('/a/a/a/a/a/a/'), Path('/a/b/a/a/a/')] mydirs.sort(key = lambda x: len(x.parts)) roots = mydirs.copy() for dir1 in mydirs: for dir2 in mydirs: if dir1 == dir2 or len(dir2.parts) <= len(dir1.parts): continue # 替换为原生判断,Python 3.8及以下可替换为 dir1 in dir2.parents if dir2.is_relative_to(dir1): roots.remove(dir2) print(f'pruned subdir {str(dir2)} of {str(dir1)}') print(roots)
内容的提问来源于stack exchange,提问作者MountainX
相关产品推荐
相关产品推荐

