python:获取目录上两层

python: get directory two levels up

好的...我不知道模块 x 在哪里,但我知道我需要获取上两级目录的路径。

那么,有没有更优雅的做法:

import os
two_up = os.path.dirname(os.path.dirname(__file__))

欢迎 Python 2 和 3 的解决方案!

您可以使用 pathlib. Unfortunately this is only available in the stdlib for Python 3.4. If you have an older version you'll have to install a copy from PyPI here。使用 pip.

应该很容易做到
from pathlib import Path

p = Path(__file__).parents[1]

print(p)
# /absolute/path/to/two/levels/up

这使用 parents 序列提供对父目录的访问并选择第二个。

请注意,在这种情况下,p 将是某种形式的 Path 对象,具有自己的方法。如果您需要字符串形式的路径,则可以对它们调用 str

很简单:

这是你想要的:

import os.path as path

two_up =  path.abspath(path.join(__file__ ,"../.."))

就我个人而言,我发现使用 os 模块是最简单的方法,如下所述。如果您只升一级,请将 ('../..') 替换为 ('..').

    import os
    os.chdir('../..')

--Check:
    os.getcwd()

我还没有看到 2.7 的可行答案,它不需要安装额外的依赖项并且也从文件的目录开始。它作为单行解决方案并不好,但使用标准实用程序没有错。

import os

grandparent_dir = os.path.abspath(  # Convert into absolute path string
    os.path.join(  # Current file's grandparent directory
        os.path.join(  # Current file's parent directory
            os.path.dirname(  # Current file's directory
                os.path.abspath(__file__)  # Current file path
            ),
            os.pardir
        ),
        os.pardir
    )
)

print grandparent_dir

为了证明它有效,我在这里从 ~/Documents/notes 开始,只是为了显示当前目录不会影响结果。我将带有该脚本的文件 grandpa.py 放在名为 "scripts" 的文件夹中。它向上爬到 Documents 目录,然后爬到 Mac.

上的用户目录
(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py 
/Users/alancoding/Documents/scripts/grandpa.py
(testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py 
/Users/alancoding

这是 the answer for the parent dir 的明显外推。使用通用解决方案比使用较少行的不太好的解决方案更好。

我发现以下内容在 2.7.x

中效果很好
import os
two_up = os.path.normpath(os.path.join(__file__,'../'))

您可以将其用作通用解决方案:

import os

def getParentDir(path, level=1):
  return os.path.normpath( os.path.join(path, *([".."] * level)) )

将目录提升 2 级:

 import os.path as path
 curr_dir=Path(os.path.dirname(os.path.abspath(__file__)))
 two_dir_up_=os.fspath(Path(curr_dir.parent.parent).resolve())

我已经完成了以下操作以向上两个并向下钻取其他目录

 default_config_dir=os.fspath(Path(curr_dir.parent.parent,
                                   'data/config').resolve()) 

我本来打算添加这个只是为了愚蠢,但也是因为它向新手展示了别名函数 and/or 导入的潜在用途。

写完后,我认为这段代码比迄今为止的其他答案更具可读性(即掌握意图的时间更短),可读性(通常)是王道。

from os.path import dirname as up

two_up = up(up(__file__))

注意:只有当您的模块非常小或上下文相关时,您才想做这种事情。

更多跨平台实现将是:

import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()

Windows 不支持使用 parent。还需要添加 .resolve(), 到:

Make the path absolute, resolving all symlinks on the way and also normalizing it (for example turning slashes into backslashes under Windows)

从任何目录执行时的最佳解决方案(对于 python >= 3.4)是:

from pathlib import Path
two_up = Path(__file__).resolve().parents[1]

假设您要访问 python 文件中名为 xzy 的两个文件夹。这对我和平台无关。

".././xyz"

(pathlib.Path('../../')).resolve()

100% 有效答案:

os.path.abspath(os.path.join(os.getcwd() ,"../.."))

已经有一个公认的答案,但对于两个级别,我认为链接方法可以说更具可读性:

pathlib.Path(__file__).parent.parent.resolve()

令人惊讶的是,似乎还没有人探索过这个不错的单行选项:

import os
two_up = os.path.normpath(__file__).rsplit(os.sep, maxsplit=2)[0]

rsplit 很有趣,因为 maxsplit 参数直接表示要向上移动多少个父文件夹,它总是 returns 结果只通过路径一次。

使用 Pathlib(在 Python 3.5 之后推荐,the/a 通用解决方案不仅适用于 file.py 文件,而且适用于 Jupyter(或其他类型的)笔记本和 Python shell 是:

p = Path.cwd().resolve().parents[1]

您只需将 (__file__) 替换为 cwd()(当前工作目录)。

事实上,它甚至可以用于:

p = Path().resolve().parents[1]

(当然还有 .parent.parent 而不是 parents[1]