it-source

python: 디렉터리를 두 단계 위로 가져옵니다.

criticalcode 2023. 7. 20. 21:59
반응형

python: 디렉터리를 두 단계 위로 가져옵니다.

모듈이 요... 어디 모듈인지 모르겠어요.x디렉토리에 대한 경로를 두 단계 위로 이동해야 한다는 것을 알고 있습니다.

그렇다면 좀 더 우아한 방법이 있을까요?

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

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

사용할 수 있습니다.안타깝게도 이것은 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__ ,"../.."))

나는 단지 어리석기 위해 이것을 덧붙이려고 했지만, 또한 그것이 새로운 사람들에게 앨리어싱 기능 및/또는 가져오기의 잠재적 유용성을 보여주기 때문입니다.

그것을 작성한 후, 저는 이 코드가 현재까지의 다른 답변보다 더 읽기 쉽고(즉, 의도를 파악하는 데 시간이 더 짧으며) 가독성이 (보통) 최고라고 생각합니다.

from os.path import dirname as up

two_up = up(up(__file__))

참고: 모듈이 매우 작거나 상황에 따라 응집력이 있는 경우에만 이러한 작업을 수행합니다.

디렉토리에서 실행할 때 가장 좋은 솔루션(python > = 3.4의 경우)은 다음과 같습니다.

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

디렉터리 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()) 

개인적으로, 저는 os 모듈을 사용하는 것이 아래와 같이 가장 쉬운 방법이라고 생각합니다.한 단계만 올라갈 경우에는 '.../...'를 '...'로 대체합니다.

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

--Check:
    os.getcwd()

더 많은 크로스 플랫폼 구현:

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

용사를 합니다.parent는 윈도우즈에서 지원되지 않습니다.추가할 필요도 있습니다..resolve()대상:

경로를 절대로 지정하여 진행 중인 모든 심볼 링크를 해결하고 정규화합니다(예: Windows에서 슬래시를 백슬래시로 전환).

(pathlib.경로('../../').resolve()

놀랍게도 아직 아무도 이 멋진 한 줄 옵션을 탐구하지 않은 것 같습니다.

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

rsplit그 이후로 흥미롭습니다.maxsplit매개 변수는 위로 이동할 상위 폴더 수를 직접 나타내며 항상 경로를 한 번 통과하면 결과를 반환합니다.

다음이 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)) )

xzy라는 이름의 두 폴더를 파이썬 파일에 액세스하고 싶다고 가정합니다.이것은 나와 플랫폼에 관계없이 작동합니다.

"..///xyz"

100% 유효한 답변:

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

이미 승인된 답변이 있지만, 두 단계의 단계에서 체인 방식이 더 읽기 쉽다고 생각합니다.

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

Pathlib(Pathlib, Python 3.5 이후 권장)를 사용하면 file.py 파일뿐만 아니라 Jupyter(또는 다른 종류의) 노트북 및 Python 셸에서도 작동하는 일반 솔루션은 다음과 같습니다.

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

대체하기만 하면 됩니다.(__file__)위해서cwd()(현재 작업 디렉토리).

실제로 다음과 같은 경우에도 작동할 수 있습니다.

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

(그리고 물론과 함께..parent.parent대신에parents[1])

로만os.path

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

추가 종속성을 설치할 필요가 없고 파일의 디렉터리에서 시작하는 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스크립트를 "message"라는 폴더에 저장합니다.이것은 Documents dir로 이동한 다음 Mac의 사용자 dir로 이동합니다.

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

언급URL : https://stackoverflow.com/questions/27844088/python-get-directory-two-levels-up

반응형