파이썬 : 디렉토리를 두 ​​단계 위로 가져 오기


90

좋아 ... 모듈 x이 어디에 있는지 모르겠지만 디렉토리 경로를 두 단계 위로 가져와야한다는 것을 알고 있습니다.

따라서 더 우아한 방법이 있습니까?

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

Python 2와 3 모두에 대한 솔루션을 환영합니다!


1
나는 당신의 솔루션이 완벽하다고 생각합니다. pathlib솔루션은 조금 더 좋은 더 많은 읽을 수 있지만, 파이썬 2.7에 포함되어 있지 않습니다. 나는 당신이 가진 것을 고수하고, 아마도 코멘트를 추가 할 것이라고 말하고 싶습니다.
jme 2015 년

pip install pathlib22.7에서 온 전성을 유지 하는 옵션을 추가 할 가치가있을 것 입니다.
조나단

답변:


108

사용할 수 있습니다 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

16
Path클래스의 parents실행 위치에 따라 다르므로 이것은 허용되는 대답이 아니어야합니다 . __file__현재 디렉토리에서 실행 하면 Path클래스에 부모가 없습니다. @ Sebi2020의 답변을 수락하거나 원래 방법을 사용해야합니다. 나는 당신의 원래 방법이 더 읽기 쉽다고 생각합니다.
Red-Tune-84

1
당신은 수행해야 할 수 있습니다p = Path(os.path.abspath(__file__)).parents[1]
아담 Raudonis에게

4
@AdamRaudonis 대신 os.path.abspath사용할 수 있습니다Path(__file__).resolve().parents[1]
Tulio Casagrande

7
@Kazanz가 언급했듯이이 솔루션은 다른 경로에서 실행할 때 작동하지 않습니다. 가장 좋은 해결책은 p = Path(__file__).resolve().parents[1]. 나는 또한 그것을 대답으로 추가했습니다.
pythinker

48

아주 쉽게:

원하는 것은 다음과 같습니다.

import os.path as path

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

10
그리고 아마 사용 os.pardir하기보다는 ...
jme

sys.argv [0]이 python.exe에 의해 실행 된 모듈을 반환하지 않습니까? 관심있는 모듈이 다른 패키지에서 가져온 경우에는이 작업이 필요하지 않을 것입니다. 여기에 있습니까?
jramm

모듈에서 사용하려면 대신 __file__.
Sebi2020

1
@jme ".."가 아닌 다른 문자열로 부모 디렉터리를 얻는 OS를 알고 있습니까 ???
Sebi2020

1
@ Sebi2020 네, 특히 오래된 Mac OS입니다. 여기에 목록이 있습니다 : en.wikipedia.org/wiki/Path_(computing)
jme

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__,'../'))

2

이것을 일반적인 솔루션으로 사용할 수 있습니다.

import os

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

@JanSila : 더 구체적 일 수 있습니다. 왜 파이썬 적이 지 않습니까? 가독성을 위해 이것이 무엇을하는지 더 많은 주석을 달 수 있습니다.하지만 결국 표준 파이썬 언어 기능을 사용하고 있습니다. 예를 들어 stackoverflow.com/questions/36901
Axel Heider

약간 조밀하지만 너무 추상적이고 읽을 수 없다고 생각합니다. 여기에 게시 된 다른 답변의 일반화 된 버전입니다. 하지만 함수를 구현할 필요없이 작업을 수행하는 표준 라이브러리 방식을 원합니다.
ryanjdillon

1

더 많은 크로스 플랫폼 구현은 다음과 같습니다.

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

parentWindows에서는 사용 이 지원되지 않습니다. 또한 다음에 추가해야합니다 .resolve().

경로를 절대 경로로 만들고 도중에 모든 심볼릭 링크를 해결하고 정규화합니다 (예 : Windows에서 슬래시를 백 슬래시로 변경).


2
parentWindows에서 작동하지 않는 소스가 있습니까? 이 댓글을 작성한 이후 언젠가 수정 된 것 같습니다. Windows 10에서 Python 3.7.2를 사용하면 잘 작동합니다.
Nathan

나는 얻을 수 있었다 parent파이썬 3.6.5로 Windows 10에서 작업 있습니다. @Zhukovgeen에 대해 말하는 파이썬 버전은 무엇입니까?
ggulgulia

@ggulgulia 나는 3.7 생각
zhukovgreen

1

파이썬 파일에서 xzy 폴더 두 개에 액세스하려고한다고 가정합니다. 이것은 저와 플랫폼 독립적으로 작동합니다.

".././xyz"


0

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


모듈이 아닌 작업 디렉토리에 상대적인 경로를 제공합니다
jramm

-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의 사용자 디렉토리까지 크롤링합니다.

(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대한 대답 의 명백한 외삽입니다 . 적은 수의 라인에서 덜 좋은 솔루션보다 일반적인 솔루션을 사용하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.