Programing

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

lottogame 2020. 3. 16. 08:15
반응형

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


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

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. @ kender의 대답은 사용 os.path.join(yourpath, os.pardir).


파이썬 3.4 이상

from pathlib import Path
Path('C:\Program Files').parent

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

import os
print"------------------------------------------------------------"
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
print("example 1: "+SITE_ROOT)
PARENT_ROOT=os.path.abspath(os.path.join(SITE_ROOT, os.pardir))
print("example 2: "+PARENT_ROOT)
GRANDPAPA_ROOT=os.path.abspath(os.path.join(PARENT_ROOT, os.pardir))
print("example 3: "+GRANDPAPA_ROOT)
print "------------------------------------------------------------"

당신이 원하는 경우 에만 이름 인수 및 제공 파일의 바로 부모 폴더의 하지 절대 경로 해당 파일을 :

os.path.split(os.path.dirname(currentDir))[1]

즉, currentDir값이/home/user/path/to/myfile/file.ext

위 명령은 다음을 반환합니다.

myfile


>>> import os
>>> os.path.basename(os.path.dirname(<your_path>))

예를 들어 우분투에서 :

>>> my_path = '/home/user/documents'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'user'

예를 들어 Windows의 경우 :

>>> my_path = 'C:\WINDOWS\system32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'

두 예제 모두 Python 2.7에서 시도했습니다.


import os.path

os.path.abspath(os.pardir)

Tung의 답변에 무언가를 추가하기 만하면됩니다 ( rstrip('/')유닉스 상자에 있으면 더 안전한면을 사용해야합니다).

>>> input = "../data/replies/"
>>> os.path.dirname(input.rstrip('/'))
'../data'
>>> input = "../data/replies"
>>> os.path.dirname(input.rstrip('/'))
'../data'

그러나을 사용하지 않으면 rstrip('/')입력 내용이

>>> input = "../data/replies/"

출력

>>> os.path.dirname(input)
'../data/replies'

이는 당신이 모두를 원하는대로에서 무엇을 찾고있어 아마하지 않습니다 "../data/replies/""../data/replies"같은 방식으로 작동 할 수 있습니다.


print os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))

이것을 사용하여 py 파일의 현재 위치의 부모 디렉토리를 얻을 수 있습니다.


import os

dir_path = os.path.dirname(os.path.realpath(__file__))
parent_path = os.path.abspath(os.path.join(dir_path, os.pardir))

다음과 같은 디렉토리 구조가 있다고 가정하십시오.

1]

/home/User/P/Q/R

디렉토리 R에서 "P"의 경로에 액세스하고 싶을 때

ROOT = os.path.abspath(os.path.join("..", os.pardir));

2]

/home/User/P/Q/R

디렉토리 R에서 "Q"디렉토리의 경로에 액세스하려고합니다.

ROOT = os.path.abspath(os.path.join(".", os.pardir));

부모 디렉토리 경로 를 가져 와서 새 디렉토리를 만드십시오 (name new_dir)

부모 디렉토리 경로 얻기

os.path.abspath('..')
os.pardir

실시 예 1

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.pardir, 'new_dir'))

실시 예 2

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.path.abspath('..'), 'new_dir'))

os.path.abspath('D:\Dir1\Dir2\..')

>>> 'D:\Dir1'

그래서 ..도움이


import os

def parent_filedir(n):
    return parent_filedir_iter(n, os.path.dirname(__file__))

def parent_filedir_iter(n, path):
    n = int(n)
    if n <= 1:
        return path
    return parent_filedir_iter(n - 1, os.path.dirname(path))

test_dir = os.path.abspath(parent_filedir(2))

위에 주어진 대답은 모두 하나 또는 두 개의 디렉토리 레벨로 올라가는 데는 완벽하지만, 디렉토리 트리를 여러 레벨 (예 : 5 또는 10)로 탐색해야하는 경우 약간 번거로울 수 있습니다. N os.pardir의의 목록에 가입하면 간결하게 수행 할 수 있습니다 os.path.join. 예:

import os
# Create list of ".." times 5
upup = [os.pardir]*5
# Extract list as arguments of join()
go_upup = os.path.join(*upup)
# Get abspath for current file
up_dir = os.path.abspath(os.path.join(__file__, go_upup))

참고 URL : https://stackoverflow.com/questions/2860153/how-do-i-get-the-parent-directory-in-python

반응형