부모 디렉토리 위치를 얻는 방법


131

이 코드는 b.py에서 templates / blog1 / page.html을 얻습니다.

path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))

하지만 부모 디렉토리 위치를 얻고 싶습니다.

aParent
   |--a
   |  |---b.py
   |      |---templates
   |              |--------blog1
   |                         |-------page.html
   |--templates
          |--------blog1
                     |-------page.html

부모의 위치를 ​​얻는 방법

감사

업데이트 :

이것은 맞다 :

dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))

또는

path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))

2
그래서 당신은 싶어 blog1a? 현재 파일은 어디에 있습니까?
Felix Kling

코드가하는 일을 이해하고 있습니까?
SilentGhost

1
예, templates / blog1 / page.html
zjm1126

os.path.join('templates', 'blog1/page.html')나에게 이상해 보인다. 당신은 것들을 섞고 있습니다. 어느 os.path.join('templates', 'blog1', 'page.html')'templates/blog1/page.html'. 그리고 훨씬 더 쉽게는 것 os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))다음
펠릭스 클링

1
@zjm : 아니, 당신은하지 않습니다 얻을 해당 페이지를. 템플릿 파일을 얻는 데 사용할 수있는 블랙 박스는 아닙니다. 일련의 사소한 작은 단계를 수행하며 이해할 수 있다면이 질문이 없을 것입니다.
SilentGhost

답변:


173

dirname을 반복해서 적용하여 더 높아질 수 있습니다 dirname(dirname(file)).. 그러나 이것은 루트 패키지까지만 가능합니다. 이것이 문제인 경우 다음을 사용 os.path.abspath하십시오 dirname(dirname(abspath(file)))..


37
OP가 알고있는 것을 알고 dirname있습니다. 디렉토리에 dirname을 적용하면 부모 디렉토리가 생성된다는 것은 모든 사람에게 분명하지 않습니다.
Marcelo Cantos

4
dirname항상 상위 디렉토리를 리턴 하지는 않습니다 . twitter.com/#!/ActiveState/status/671049326788608
Sridhar Ratnakumar

2
@Sridhar : 그것은 당신의 관점에 달려 있습니다; /리프 디렉토리 항목 자체를 나타내지 않는 것으로 끝나는 경로를 고려 하지만 그 내용 은 기존 디렉토리가 아닌 mv xxx yyy/경우 실패합니다 yyy. 어쨌든, 우리가 주어진 것으로 당신의 요점을 취하더라도, 그것은 내 대답의 맥락에서 무관합니다. 어느 쪽 file도의 결과는 dirname이제까지 종료됩니다 /.
Marcelo Cantos

1
마이너 보정 : dirname반환 할 수 있습니다 '/'분명히에 끝나는 /. AFAIK만이 예외입니다.
Marcelo Cantos

55

os.path.abspath아무것도 확인하지 않으므로 이미 문자열을 추가하는 __file__경우 귀찮 dirname거나 조인 할 필요가 없습니다 . __file__디렉토리로 취급 하고 등반을 시작하십시오.

# climb to __file__'s parent's parent:
os.path.abspath(__file__ + "/../../")

그보다 훨씬 덜 복잡합니다 os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) 관리하기dirname(dirname(__file__)) 합니다. 두 단계 이상의 등반은 말도 안되게 시작됩니다.

그러나 얼마나 많은 레벨을 올라갈 지 알기 때문에 간단한 작은 기능으로 이것을 정리할 수 있습니다.

uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n])

# __file__ = "/aParent/templates/blog1/page.html"
>>> uppath(__file__, 1)
'/aParent/templates/blog1'
>>> uppath(__file__, 2)
'/aParent/templates'
>>> uppath(__file__, 3)
'/aParent'

2
이것은 훌륭하지만 표준 라이브러리가 이것을 달성하는 편리한 기능을 추가하면 멋질 것입니다 ...이 기능이 필요할 때마다 그렇게하고 싶지 않습니다
gradi3nt

4
os.path.abspath(os.path.join(__file__, "..", "..")보다 이식?
slowD

40

Python 3.4 이상 에서 모듈 과 상대 경로 를 사용하십시오 pathlib.

from pathlib import Path

Path(__file__).parent

여러 통화를 사용 parent하여 경로를 더 진행할 수 있습니다 .

Path(__file__).parent.parent

parent두 번 지정하는 대신 다음을 사용할 수 있습니다.

Path(__file__).parents[1]

2
경로를 수정하기 위해 문자열로 사용해야하는 경우을 사용하면 str(Path(__file__).parent)됩니다.
Philipp

12
os.path.dirname(os.path.abspath(__file__))

경로를 알려줘야합니다 a.

그러나 b.py현재 실행중인 파일 인 경우 다음을 수행하여 동일한 결과를 얻을 수 있습니다

os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))

1
o, 나는 당신이 옳다는 것을 알고 있으며 a의 부모 폴더를 얻고 싶습니다. 얻는 방법
zjm1126

@ zjm1126 : Marcelo Cantos의 답변을 참조하십시오. dirname()두 번 적용하십시오 . 지금 필요한 모든 것이이 사이트에 있어야합니다.
Felix Kling

9

os.pardir../더 읽기 쉽고 읽기 쉬운 방법입니다 .

import os
print os.path.abspath(os.path.join(given_path, os.pardir))  

given_path의 부모 경로를 반환합니다


5

간단한 방법은 다음과 같습니다.

import os
current_dir =  os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.abspath(current_dir + "/../")
print parent_dir

3

..부모 폴더의 부모를 얻기 위해 두 폴더에 가입 할 수 있습니까?

path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))

3

다음을 사용하여 이전 폴더로 이동하십시오.

os.chdir(os.pardir)

여러 번 점프 해야하는 경우 좋고 쉬운 해결책은이 경우 간단한 데코레이터를 사용하는 것입니다.


1

다음은 비교적 간단한 또 ​​다른 솔루션입니다.

  • 사용하지 않습니다 dirname()( "file.txt"와 같은 한 수준 인수 또는 ".."와 같은 상대 부모에서 예상대로 작동하지 않음)
  • 사용하지 않고 abspath()(현재 작업 디렉토리에 대한 가정을 피함) 대신 경로의 상대적인 특성을 유지합니다

그냥 사용 normpath하고 join:

def parent(p):
    return os.path.normpath(os.path.join(p, os.path.pardir))

# Example:
for p in ['foo', 'foo/bar/baz', 'with/trailing/slash/', 
        'dir/file.txt', '../up/', '/abs/path']:
    print parent(p)

결과:

.
foo/bar
with/trailing
dir
..
/abs

0

나는 이것이 더 좋다고 생각한다.

os.path.realpath(__file__).rsplit('/', X)[0]


In [1]: __file__ = "/aParent/templates/blog1/page.html"

In [2]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[3]: '/aParent'

In [4]: __file__ = "/aParent/templates/blog1/page.html"

In [5]: os.path.realpath(__file__).rsplit('/', 1)[0]
Out[6]: '/aParent/templates/blog1'

In [7]: os.path.realpath(__file__).rsplit('/', 2)[0]
Out[8]: '/aParent/templates'

In [9]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[10]: '/aParent'

확실하지 않지만 OS에 따라 다릅니다 (Windows에서는 작동하지 않음). 또한 상대 경로를 사용할 수 없습니다.
kgadek

그것은 끔찍한 해결책입니다. 모든 OS에서 작동하지는 않습니다
web.learner

0

나는 시도했다 :

import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.