Python에서 파일의 폴더 이름 가져 오기


87

Python에서 작업중인 파일이 포함 된 폴더의 이름을 가져 오려면 어떤 명령을 사용해야합니까?

"C:\folder1\folder2\filename.xml"

여기 "folder2"내가 얻고 싶은 것이 있습니다.

내가 생각 해낸 유일한 것은 os.path.split두 번 사용하는 것입니다 .

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

더 좋은 방법이 있습니까?


중복 가능성 :
Python-

답변:


162

다음을 사용할 수 있습니다 dirname.

os.path.dirname(path)

경로명 경로의 디렉토리 이름을 반환합니다. 이것은 split () 함수에 경로를 전달하여 반환 된 쌍의 첫 번째 요소입니다.

그리고 전체 경로가 주어지면 경로의 마지막 부분을 얻기 위해 정상적으로 분할 할 수 있습니다. 예를 들어 다음을 사용합니다 basename.

os.path.basename(path)

경로명 경로의 기본 이름을 반환합니다. 이것은 split () 함수에 경로를 전달하여 반환 된 쌍의 두 번째 요소입니다. 이 함수의 결과는 Unix basename 프로그램과 다릅니다. 여기서 '/ foo / bar /'의 basename은 'bar'를 반환하고 basename () 함수는 빈 문자열 ( '')을 반환합니다.


모두 함께:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'

7
또는 마지막 부분을 얻기 위해 다음을 사용할 수 있습니다.os.path.basename
mgilson

@mgilson 좋은 지적! 이것을 반영하기 위해 내 답변을 업데이트했습니다. 많은 감사합니다
fedorqui 'SO stop harming'10

17

dirname 을 사용하려고합니다 . 하나의 디렉토리 만 원하면 os.path.basename 을 사용할 수 있습니다 .

모두 합치면 다음과 같이 보입니다.

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

그러면 "other_sub_dir"이 표시됩니다.

다음은 이상적인 접근 방식은 아니지만 원래 os.path.split을 사용하여 제안하고 마지막 항목을 가져옵니다. 다음과 같이 보일 것입니다.

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]

5
로 분할하는 것보다 str.split사용 os.path.split하는 것이 좋습니다 (다른 OS의 차이점을 더 잘 처리 함).
mgilson 2015-10-27

예. 당신이 맞아요! 내 마음이 미끄러졌다. 감사 @mgilson은
idjaw

9

이것은 꽤 오래되었지만 Python 3.4 이상을 사용하는 경우 PathLib을 사용 하십시오 .

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)

8

os.path.dirname 당신이 찾고있는 것입니다-

os.path.dirname(r"C:\folder1\folder2\filename.xml")

r원시 문자열로 간주되도록 문자열 앞에 추가 해야합니다.

데모-

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

원하는 경우 위의 예제와 함께 folder2사용할 수 있습니다.os.path.basename

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

데모-

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'

1

전체 경로를 문자열로 얻은 다음 운영 체제의 구분 문자를 사용하여 목록으로 분할 할 수 있습니다. 그런 다음 음수 인덱스를 사용하여 목록 끝에서 요소에 액세스하여 프로그램 이름, 폴더 이름 등을 얻습니다.

이렇게 :

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

위의 출력은 다음과 같습니다.

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev

1

pathlib 를 사용할 수 있습니다 .

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

위의 출력은 다음과 같습니다.

'folder2'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.