파이썬에서 경로의 마지막 부분 만 얻는 방법?


233

파이썬에서 다음과 같은 경로가 있다고 가정하십시오.

/folderA/folderB/folderC/folderD/

folderD부분 만 어떻게 구할 수 있습니까?

답변:


389

os.path.normpath다음을 사용하십시오 os.path.basename.

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

첫 번째는 후행 슬래시를 제거하고 두 번째는 경로의 마지막 부분을 제공합니다. 를 사용 basename하면 마지막 슬래시 이후의 모든 항목 만 제공됩니다 (이 경우에는) ''.


1
나는 처음에는 rstrip('/')더 간단 하다고 생각 했지만 곧 사용해야한다는 것을 빨리 깨달았 rstrip(os.path.sep)으므로 분명히 사용 normpath이 정당화되었습니다.
Erik Kaplun

이는 윈도우 긴 경로, 예를 들어,에서 작동하지 않는 것 '\\\\?\\D:\\A\\B\\C\\''\\\\?\\UNC\\svr\\B\\C\\'(반환 빈 문자열) 솔루션은 모든 경우에 적용됩니다.
omasoud

25

넌 할 수있어

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

업데이트 1 : 이 방법은 /folderA/folderB/folderC/folderD/xx.py에 제공하는 경우 작동합니다. 이것은 xx.py를 기본 이름으로 제공합니다. 내가 당신이 원하는 것은 아닙니다. 그래서 당신은 이것을 할 수 있습니다-

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

UPDATE2 : lars가 지적했듯이 후미 '/'를 수용하도록 변경하십시오.

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

Python-think에서 os.path.basename ( "... /")은 ''를 올바르게 산출합니다. 예, 나도 그 차선책을 찾으십시오. 아래의 ... basename (... normpath ... 솔루션은 정식입니다.
Cameron Laird

@lars 네! 이 경우 경로를 기본 이름으로 보내기 전에 경로를 먼저 정규화하는 것을 보았습니다. os.path.basename (os.path.normpath ( '/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju

UPDATE2는 지금까지 내가 찾은 최고의 방법입니다.
akki

23

파이썬 3에서는 다음과 같은 pathlib모듈을 사용할 수 있습니다 pathlib.PurePath.

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

파일이있는 마지막 폴더 이름을 원할 경우 :

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'

18

내 접근 방식은 다음과 같습니다.

>>> import os
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC

1
귀하의 접근 방식은 위에서 언급 한 것과 다른 / 더 나은 해결 방법은 무엇입니까?
user1767754

9

파일이있는 마지막 폴더 이름을 얻는 솔루션을 찾고 있었고 방금 split두 번 사용 하여 올바른 부분을 얻었습니다. 그것은 질문이 아니지만 Google이 나를 여기로 옮겼습니다.

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)

2

순진한 솔루션 (Python 2.5.2+) :

s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]

왜 이걸 사용합니까?
Chris_Rands

1

나는 이것을 위해 Path 의 부품 방법을 좋아한다 .

grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')

0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()

10
진심으로, os.path모듈을 사용하십시오 .
종료-익명-무스

0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]

그는 원한다 folderD. 아닙니다folderC
Srikar Appalaraju

1
후행 슬래시가 목록의 최종 항목을 ""로 만들기 때문에 "folderD"를 표시합니다.
neil

21
진심으로, os.path모듈을 사용하십시오 .
종료-익명-무스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.