Python: 将目录提升两级

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

那么,有没有一种更优雅的方式:

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

我们欢迎针对 Python2和3的解决方案!

159990 次浏览

你可以使用 pathlib。遗憾的是,这只能在 Python 3.4的 stdlib 中使用。如果您有一个较旧的版本,则必须从 PyPI 给你安装一个副本。这应该很容易做到使用 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放在一个名为“ script”的文件夹中。它爬行到“文档”目录,然后爬行到 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

这是显而易见的 父目录的答案外推法。使用通用的解决方案比使用较少行的不太好的解决方案更好。

我发现以下内容在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())

我添加这个只是为了显得愚蠢,但也是因为它向新用户展示了别名函数和/或导入的潜在用途。

写完之后,我认为这段代码比迄今为止的其他答案更具可读性(也就是说,理解意图的时间更短) ,而且可读性(通常)是最重要的。

from os.path import dirname as up


two_up = up(up(__file__))

注意: 只有在模块非常小或上下文内聚的情况下才需要执行此类操作。

更多的跨平台实施将包括:

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

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

使路径绝对,解决所有符号链接的方式,并规范化(例如,转换为斜杠下的 Windows 反斜杠)

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

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

假设您希望访问名为 xzy 的文件夹,那么可以访问 Python 文件中的两个文件夹。这对我和平台独立工作。

“ . ././xyz”

(pathlib. Path (’. ./. ./’)) . Resol()

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参数直接表示要向上移动的父文件夹数量,并且它总是仅通过路径返回一个结果。

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

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

你只需用 (__file__)代替 cwd()(当前工作目录)。

实际上,它甚至只需要:

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

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