我正在寻找一种从特定目录上移-
个目录的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
模块?
答案 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