如何以Python方式上移n个目录?

时间:2019-04-04 13:06:47

标签: python python-3.x operating-system

我正在寻找一种从特定目录上移-个目录的Python方法。

假设我们有示例路径n。如果要上移/data/python_env/lib/python3.6/site-packages/matplotlib/mpl-data个目录,则应该以{{1​​}}结尾。

以下方法可上移n=2个目录:

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

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

是否有更好的,更Python化的解决方案,也许使用n模块?

5 个答案:

答案 0 :(得分:8)

您可以使用标准库的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

答案 1 :(得分:7)

如何使用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

答案 2 :(得分:1)

您可以为此使用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应该处理得很好。而且,你得到了单线。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

对于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