我正在寻找一种从给定目录向上移动目录的巨无质的方式 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
?
您可以使用标准库的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
如何使用 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
您可以使用巨蟒 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 应该处理好这件事。而且, 你有一个单行线。
解决此问题的一个解决方案可以利用 ..
父目录这一速记。所以, 使用 pathlib
你可以写
from pathlib import Path
up_n = lambda orig, n: Path(orig).joinpath('/'.join(['..']*n))
对于 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