python:获取目录两个级别


86

好的...我不知道模块在哪里x,但是我知道我需要将目录的路径上移两个级别。

因此,有没有一种更优雅的方法:

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

欢迎使用适用于Python 2和3的解决方案!


1
我认为您的解决方案完全可以。pathlib解决方案更好一些,也更具可读性,但Python 2.7不包含该解决方案。我想说的是坚持下去,也许再加上评论。
jme 2015年

也许值得添加pip install pathlib22.7中保持理智的选项。
jonathan

Answers:


104

您可以使用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它们。


多数民众赞成在一个很好的答案,感谢和py3。对于py2,它可能不会比我最初尝试的更好,因为它会创建它并产生额外的依赖关系
jramm 2015年

16
这不是可接受的答案,因为Path该类parents取决于执行位置。如果__file__从当前目录执行,则Path该类将没有父级。@ Sebi2020的答案应该被接受,或者应该使用您的原始方法。我相信您的原始方法更具可读性。
Red-Tune-84

1
您可能需要做p = Path(os.path.abspath(__file__)).parents[1]
Adam Raudonis

4
@AdamRaudonis除了os.path.abspath,您还可以使用Path(__file__).resolve().parents[1]
Tulio Casagrande

7
如@Kazanz所述,从其他路径执行时,此解决方案无效。最好的解决方案是:p = Path(__file__).resolve().parents[1]。我也将其添加为答案。
pythinker

46

很容易:

这是您想要的:

import os.path as path

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

8
也许使用os.pardir而不是..
jme 2015年

sys.argv [0]是否不返回由python.exe运行的模块?因此,如果我感兴趣的模块是从其他软件包中导入的,这将不是必需的工作。我在这里吗?
jramm

如果要在模块中使用它,请使用__file__
Sebi2020

1
@jme您是否知道一个操作系统,在该操作系统中,您使用除“ ..”之外的其他字符串获取父目录。
Sebi2020

1
@ Sebi2020是的,特别是旧的Mac OS。以下是列表:en.wikipedia.org/wiki/Path_(计算)
jme 2015年

22

我之所以添加它只是为了愚蠢,还因为它向新手展示了别名函数和/或导入的潜在用途。

编写它之后,我认为此代码比迄今为止的其他答案更具可读性(即,更少的掌握意图的时间),并且(通常)可读性为准。

from os.path import dirname as up

two_up = up(up(__file__))

注意:仅在模块很小或上下文相关时,才需要执行此类操作。


14

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

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

10

为了使目录达到2级:

 import os.path as path
 two_up = path.abspath(path.join(os.getcwd(),"../.."))

4

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

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

--Check:
    os.getcwd()

1
硬编码我本来希望读入os.chdir(os.join('..','..'))的'/'是否可以接受
GreenAsJade

2

我发现以下内容在2.7.x中效果很好

import os
two_up = os.path.normpath(os.path.join(__file__,'../'))

1

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

import os

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

@JanSila:可以更具体一点,为什么不是pythonic?为了提高可读性,它可能会有更多注释,是的-是的,但最终它使用的是标准python语言功能,请参见例如stackoverflow.com/questions/36901
Axel Heider

它有点密集,但是我认为这不是太抽象也不可读。这只是此处发布的其他答案的通用版本。不过,我想要一种标准的库处理方式,而无需实现功能。
ryanjdillon

1

更多的跨平台实现将是:

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

parentWindows不支持使用。还需要添加.resolve(),以:

设置路径为绝对路径,解析路径上的所有符号链接并对其进行规范化(例如,在Windows下将斜杠转换为反斜杠)


2
您是否有parent无法在Windows上使用的资源?自您撰写此评论以来,似乎已解决此问题。在Windows 10上使用Python 3.7.2对我来说效果很好。–
Nathan

我可以parent使用python 3.6.5在Windows 10上工作。您在谈论@Zhukovgeen的哪个版本的python?
ggulgulia

@ggulgulia我相信那是3.7
zhukovgreen

0

假设您要访问名为xzy的文件夹,请在python文件中添加两个文件夹。这对我和平台独立都有效。

“ .././xyz”



-1

我还没有看到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”的文件夹中。在Mac上,它会爬网到Documents目录,然后爬到用户目录。

(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

这是对父目录dir的答案的明显推断。最好在行数较少的情况下使用一般的解决方案,而不是效果较差的解决方案。


-1

对于py 3.4及更高版本,pathlib

例:

from pathlib import Path
path = Path("../../data/foo/someting.csv").resolve()

这给出了相对于工作目录而不是模块的路径
jramm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.