[python] OS / 경로 형식에 상관없이 경로에서 파일 이름 추출

운영 체제 또는 경로 형식에 관계없이 경로에서 파일 이름을 추출하기 위해 어떤 Python 라이브러리를 사용할 수 있습니까?

예를 들어, 나는이 모든 경로가 나를 돌려주기를 원합니다 c.

a/b/c/
a/b/c
\a\b\c
\a\b\c\
a\b\c
a/b/../../a/b/c/
a/b/../../a/b/c



답변

사용 os.path.split또는 os.path.basename다른 사람이 모든 경우에하지 않습니다 작업을 제안 같이 리눅스에서 스크립트를 실행하고 고전적인 윈도우 스타일의 경로를 처리하려고 시도하는 경우, 실패합니다.

Windows 경로는 백 슬래시 또는 슬래시를 경로 구분 기호로 사용할 수 있습니다. 따라서 ntpath모듈 (Windows에서 실행할 때 os.path와 동일)은 모든 플랫폼에서 모든 (1) 경로에 대해 작동합니다.

import ntpath
ntpath.basename("a/b/c")

물론 파일이 슬래시로 끝나면 기본 이름이 비어 있으므로 처리하는 고유 한 기능을 만드십시오.

def path_leaf(path):
    head, tail = ntpath.split(path)
    return tail or ntpath.basename(head)

확인:

>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
...     'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']

(1) 한 가지주의 사항이 있습니다. Linux 파일 이름 에는 백 슬래시가 포함될 수 있습니다 . 따라서 Linux에서는 r'a/b\c'항상 폴더 의 파일 b\c을 참조하고 aWindows에서는 항상cb 폴더의 하위 폴더에있는 파일을a 합니다. 앞뒤 슬래시가 경로에 사용하는 경우 그래서, 당신은 필요 올바르게 해석 할 수 있도록 관련 플랫폼을 알고. 실제로 Linux 파일 이름에는 백 슬래시가 거의 사용되지 않으므로 일반적으로 Windows 경로라고 가정하는 것이 안전하지만 코드를 작성할 때이 점을 명심하여 실수로 보안 허점을 만들지 마십시오.


답변

실제로 원하는 것을 정확하게 반환 하는 함수 가 있습니다.

import os
print(os.path.basename(your_path))


답변

os.path.split
은 당신이 찾고있는 기능입니다

head, tail = os.path.split("/tmp/d/a.dat")

>>> print(tail)
a.dat
>>> print(head)
/tmp/d


답변

파이썬 3에서

>>> from pathlib import Path
>>> Path("/tmp/d/a.dat").name
'a.dat'


답변

import os
head, tail = os.path.split('path/to/file.exe')

tail은 원하는 파일 이름입니다.

자세한 내용은 Python OS 모듈 문서 를 참조하십시오


답변

import os
file_location = '/srv/volume1/data/eds/eds_report.csv'
file_name = os.path.basename(file_location )  #eds_report.csv
location = os.path.dirname(file_location )    #/srv/volume1/data/eds


답변

귀하의 예에서는 오른쪽에서 슬래시를 제거하여 반환해야합니다 c.

>>> import os
>>> path = 'a/b/c/'
>>> path = path.rstrip(os.sep) # strip the slash from the right side
>>> os.path.basename(path)
'c'

두 번째 수준 :

>>> os.path.filename(os.path.dirname(path))
'b'

업데이트 : lazyr정답을 제공 했다고 생각 합니다. 내 코드는 유닉스 시스템의 Windows와 같은 경로와 Windows 시스템의 유닉스와 같은 경로에서 작동하지 않습니다.