【发布时间】:2020-07-15 23:39:36
【问题描述】:
我有一个函数,它返回我通过常量名称查找的 特定 父级的完整路径。我目前正在使用os.path 和字符串作为路径,所以现在这是使用正则表达式完成的。
我想要的是例如一个常量parent = d 能够得到:
/a/b/c/d/e --> /a/b/c/d
/a/b/c/d/e/f --> /a/b/c/d
/root/a/b/c/d/e --> /root/a/b/c/d
注意:如示例所示,我不想依赖双方的任何固定位置。
我尝试了两种方法,但都感觉有点笨拙:
-
>>> path = "/a/b/c/d/e/f" >>> parts = Path(path).parts >>> parent_index = len(parts) - 1 - parts.index('d') - 1 >>> Path(path).parents[parent_index] PosixPath('/a/b/c/d') -
使用
parts并连接相关的:>>> path = "/root/a/b/c/d/e" >>> parts = Path(path).parts >>> Path(*parts[:parts.index('d')+1]) PosixPath('/root/a/b/c/d')
我会说第二个似乎是合理的,但我的问题仍然是:有没有更直接的 pythonic 方法来实现这一点? parents 的重复索引和切片感觉效率低下且相当混乱。
附:如果该部分不存在于路径中,则足以引发异常或任何指示符(现在我用index 将代码与try/except 包装在一起)。
【问题讨论】:
-
os.path.dirname(mypath) -
@Todd
os.path.dirname("/a/b/c/d/e/f")将提供'/a/b/c/d/e',但我正在寻找'/a/b/c/d',如上例所述 -
再次调用 os.path.dirname() =)
-
如果您的应用程序正在尝试获取以“d”结尾的所有文件路径的列表,您也许可以使用
glob.glob('**/d', recursive=True)- 但不要从根目录执行此操作,因为它'会永远。您可能希望将其限制为特定的文件夹树。 -
@Todd,正如您在示例中看到的那样,父母的数量各不相同。至于
glob,这会从系统中调出很多结果,我只需要给定文件路径中的那个
标签: python python-3.x pathlib