如何以 Pythonic 方式向上移动目录?

Posted

技术标签:

【中文标题】如何以 Pythonic 方式向上移动目录?【英文标题】:How to move up n directories in Pythonic way? 【发布时间】:2019-08-26 06:13:01 【问题描述】:

我正在寻找一种 Python 方式来从给定目录中向上移动 n 目录。

假设我们有示例路径/data/python_env/lib/python3.6/site-packages/matplotlib/mpl-data。如果我们要向上移动n=2 目录,我们应该最终到达/data/python_env/lib/python3.6/site-packages

以下工作可向上移动n 目录:

up_n = lambda path, n: '/'.join(path.split('/')[:-n])

但是,它的可读性不是很好,并且对于 Windows 机器上的路径会失败。本质上,感觉不是一个非常pythonic的解决方案。

是否有更好、更 Pythonic 的解决方案,可能使用 os 模块?

【问题讨论】:

我觉得你应该使用Path模块,更好地避免硬编码取决于操作系统! 【参考方案1】:

可以使用标准库的pathlib模块:

from pathlib import Path

path = Path('/data/python_env/lib/python3.6/site-packages/matplotlib/mpl-data')

levels_up = 2
print(path.parents[levels_up-1])
# /data/python_env/lib/python3.6/site-packages

【讨论】:

我觉得这是最好的解决方案:跨平台,易于阅读且不涉及n 调用os.path。但是,由于pathlib 仅在 Python 3.4+ 的标准库中,因此在旧版 python 上阅读此内容的用户应考虑安装 pathlibpip【参考方案2】:

os.path.dirname 迭代怎么样:

import os

s = "/data/python_env/lib/python3.6/site-packages/matplotlib/mpl-data"
for _ in range(2):
    s = os.path.dirname(s)

print(s)

打印:

/data/python_env/lib/python3.6/site-packages

【讨论】:

【参考方案3】:

您可以为此使用 python os.path 模块:

>>> p = '/data/python_env/lib/python3.6/site-packages/matplotlib/mpl-data'
>>> os.path.normpath(os.path.join(p, "..", ".."))
'/data/python_env/lib/python3.6/site-packages'

或者泛指n

os.path.normpath(os.path.join(*([p]+[".."]*n)))

这样,您不必关心使用的是 Windows \ 还是 UNIX /。 Python 应该能很好地处理这个问题。而且,你有一个单线。

【讨论】:

我认为他们要求它是 more 可读而不是 less ;) @Chris_Rands 是对的:这不是特别可读。话虽如此,我当然不认为它比我最初的解决方案更具可读性。无论如何,受这个解决方案的启发,我想出了os.path.abspath(os.path.join(p, "../"*n)),我认为这是一个边际改进。【参考方案4】:

对此的一种解决方案可以利用.. 是父目录的简写形式。所以,使用pathlib 你可以写

from pathlib import Path
up_n = lambda orig, n: Path(orig).joinpath('/'.join(['..']*n))

【讨论】:

【参考方案5】:

对于 Python 3.4+,pathlib 可能是最佳选择。

也就是说,以下内容也适用于旧版本(包括 Python 2.x):

import os

def up_n(path, n):
    components = os.path.normpath(path).split(os.sep)
    return os.sep.join(components[:-n])

if __name__ == '__main__':
    path = '/data/python_env/lib/python3.6/site-packages/matplotlib/mpl-data'
    result = up_n(path, 2)
    print(result)  # -> \data\python_env\lib\python3.6\site-packages

【讨论】:

以上是关于如何以 Pythonic 方式向上移动目录?的主要内容,如果未能解决你的问题,请参考以下文章

键盘出现时如何向上移动集合视图控制器?

什么是依赖注入的 Pythonic 方式?

在python中以特定间隔运行任务[重复]

如何使文本以曲线运动在屏幕上向上移动

以pythonic方式打印字典中最大值的键[重复]

如何将嵌套 div 向上移动两个 div 级别以匹配父级?