[python] 파이썬에서 부모 디렉토리를 어떻게 얻습니까?

누군가 크로스 플랫폼 방식으로 파이썬에서 경로의 부모 디렉토리를 얻는 방법을 말해 줄 수 있습니까? 예 :

C:\Program Files ---> C:\

C:\ ---> C:\

디렉토리에 상위 디렉토리가 없으면 디렉토리 자체를 리턴합니다. 질문은 간단 해 보이지만 Google을 통해 파헤칠 수 없습니다.



답변

Python 3.4에서 업데이트

pathlib모듈을 사용하십시오 .

from pathlib import Path
path = Path("/here/your/path/file.txt")
print(path.parent)

이전 답변

이 시도:

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

yourpath부모가 원하는 경로는 어디 입니까?


답변

사용 os.path.dirname:

>>> os.path.dirname(r'C:\Program Files')
'C:\\'
>>> os.path.dirname('C:\\')
'C:\\'
>>>

주의 사항 : os.path.dirname()후행 슬래시가 경로에 포함되는지 여부에 따라 다른 결과를 제공합니다. 이것은 원하는 의미론 일 수도 있고 아닐 수도 있습니다. Cf. @ 켄더의 대답을 사용하십시오 os.path.join(yourpath, os.pardir).


답변

Pathlib 메소드 (Python 3.4+)

from pathlib import Path
Path('C:\Program Files').parent
# Returns a Pathlib object

전통적인 방법

import os.path
os.path.dirname('C:\Program Files')
# Returns a string

어떤 방법을 사용해야합니까?

다음과 같은 경우 전통적인 방법을 사용하십시오.

  • Pathlib 객체를 사용하는 경우 기존 코드 생성 오류가 걱정됩니다. Pathlib 객체는 문자열과 연결할 수 없습니다.

  • 파이썬 버전이 3.4 미만입니다.

  • 줄이 필요하고 줄을 받았습니다. 예를 들어 파일 경로를 나타내는 문자열이 있고 부모 디렉토리를 가져와 JSON 문자열에 넣을 수 있다고 가정하십시오. Pathlib 객체로 변환하고 다시 되 돌리는 것은 어리석은 일입니다.

위의 어느 것도 적용되지 않으면 Pathlib를 사용하십시오.


Pathlib는 무엇입니까?

Pathlib이 무엇인지 모르는 경우 Pathlib 모듈은 파일 작업을 훨씬 쉽게 만들어주는 훌륭한 모듈입니다. 대부분의 경우 파일로 작동하는 모든 내장 Python 모듈은 Pathlib 객체와 문자열을 모두 허용합니다. Pathlib 문서 에서 Pathlib로 할 수있는 몇 가지 깔끔한 작업을 보여주는 몇 가지 예를 강조 했습니다.

디렉토리 트리 내에서 탐색 :

>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')

쿼리 경로 속성 :

>>> q.exists()
True
>>> q.is_dir()
False


답변

import os
p = os.path.abspath('..')

C:\Program Files —> C:\\\

C:\ —> C:\\\


답변

@kender의 대체 솔루션

import os
os.path.dirname(os.path.normpath(yourpath))

yourpath부모가 원하는 경로는 어디 입니까?

그러나이 솔루션은 yourpath빈 문자열이나 점이있는 경우를 처리하지 않기 때문에 완벽하지 않습니다 .

이 다른 솔루션은이 코너 케이스를보다 잘 처리합니다.

import os
os.path.normpath(os.path.join(yourpath, os.pardir))

다음은 찾을 수있는 모든 경우에 대한 출력입니다 (입력 경로는 상대적입니다).

os.path.dirname(os.path.normpath('a/b/'))          => 'a'
os.path.normpath(os.path.join('a/b/', os.pardir))  => 'a'

os.path.dirname(os.path.normpath('a/b'))           => 'a'
os.path.normpath(os.path.join('a/b', os.pardir))   => 'a'

os.path.dirname(os.path.normpath('a/'))            => ''
os.path.normpath(os.path.join('a/', os.pardir))    => '.'

os.path.dirname(os.path.normpath('a'))             => ''
os.path.normpath(os.path.join('a', os.pardir))     => '.'

os.path.dirname(os.path.normpath('.'))             => ''
os.path.normpath(os.path.join('.', os.pardir))     => '..'

os.path.dirname(os.path.normpath(''))              => ''
os.path.normpath(os.path.join('', os.pardir))      => '..'

os.path.dirname(os.path.normpath('..'))            => ''
os.path.normpath(os.path.join('..', os.pardir))    => '../..'

입력 경로는 절대적입니다 (Linux 경로) :

os.path.dirname(os.path.normpath('/a/b'))          => '/a'
os.path.normpath(os.path.join('/a/b', os.pardir))  => '/a'

os.path.dirname(os.path.normpath('/a'))            => '/'
os.path.normpath(os.path.join('/a', os.pardir))    => '/'

os.path.dirname(os.path.normpath('/'))             => '/'
os.path.normpath(os.path.join('/', os.pardir))     => '/'


답변

os.path.split(os.path.abspath(mydir))[0]


답변

os.path.abspath(os.path.join(somepath, '..'))

관찰 :

import posixpath
import ntpath

print ntpath.abspath(ntpath.join('C:\\', '..'))
print ntpath.abspath(ntpath.join('C:\\foo', '..'))
print posixpath.abspath(posixpath.join('/', '..'))
print posixpath.abspath(posixpath.join('/home', '..'))