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

共5个回答,已解决, 标签: python python-3.x operating-system

我正在寻找一种从给定目录向上移动目录的巨无质的方式 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])

但是, 它不是很可读, 并且在窗口计算机上的路径失败。从本质上讲, 它并不觉得是一个非常巨无质的解决方案。

是否有更好、更多的巨无酸解决方案, 也许使用模块 os

第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
第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个答案

您可以使用巨蟒 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 应该处理好这件事。而且, 你有一个单行线。

第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 的方式向上移动 n 个目录?