파이썬 라이브러리 파일 이름을 사용할 수 있는 내가 푸십시오 충스러웠으니 패스이므로 관계 없이 운영 체제 또는 경로 형식이 될 수 있다.
예를 들어, 이 모든 경로를 반환되기를 I&; d # 39 와 같은 날 '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
사실, s # 39 there& 반환하는 정확히요 그리웠댔지 [함수은] [1]
import os
print(os.path.basename(your_path))
[1]: https://docs.python.org/2/library/os.path.html # 오스파시오바제나미
'다른' 또는 '' 를 사용하여 오스트발트하드스플리트 오스파시오바제나미 won& 제안하세요 # 39, 모든 경우에 빗나갔다. # 39 에서 스크립트를 실행하는 프로세스 및 시도할 경우, re you& linux*용 클래식 창 스타일 삼중평균 얻게된다면 실패합니다.
Indows 경로를 따라 경로 분리자를 백슬래시 또는 슬래시 사용할 수 있습니다. 따라서 '나파스' 모듈 (windows 에서 실행할 때 해당하는 오스트발트) 가 일하고 all<;; (1) < sup> /sup>. 모든 플랫폼에서 패스이므로.
import ntpath
ntpath.basename("a/b/c")
물론 슬래시로 끝나는 파일의 경우, 이 함수를 직접 만들고 이를 처리할 수 있기 때문에, basename 비어 있습니다.
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']
< br>;
[오스트발트하드스플리트] [1] 찾고자 하는 기능이 있다.
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d
[1]: http://docs.python.org/library/os.path.html # 오스트발트하드스플리트
또한 스트립 슬래시 (slash) 에서 할 수 있는 올바른 예제에서와 오른쪽면 반환되기를 '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'
업데이트: 정답은 '에서 마련한' 라시르 생각한다. 창 같은 유닉스 및 유닉스 계열 내 코드 경로에서 함께 사용할 수 없습니다 재직했습니다 대對 경로에서 windows 시스템.
이는 linux, windows 뿐만 아니라 일할 수 있는 표준 라이브러리
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']
def path_leaf(path):
return path.strip('/').strip('\\').split('/')[-1].split('\\')[-1]
[path_leaf(path) for path in paths]
결과:
['c', 'c', 'c', 'c', 'c', 'c', 'c']
파일 경로를 " 않을 경우, /" 함께 끝났다. 및 디렉터리용 " 구분된 /"; 그럼 다음 코드를 사용합니다. # 39 로 끝나는 것을 알고, t, 일반적으로 경로를 doesn& " /".
import os
path_str = "/var/www/index.html"
print(os.path.basename(path_str))
그러나 경우에 따라서는 같은 url 끝나는 /" "; 그럼 다음 코드를 사용합니다
import os
path_str = "/home/some_str/last_str/"
split_path = path_str.rsplit("/",1)
print(os.path.basename(split_path[0]))
그러나 당신의 길을 통해 스페라테드 " \"; windows 의 경로를 찾을 수 있으며, 일반적으로 다음 다음 코드를 사용할 수 있습니다.
import os
path_str = "c:\\var\www\index.html"
print(os.path.basename(path_str))
import os
path_str = "c:\\home\some_str\last_str\\"
split_path = path_str.rsplit("\\",1)
print(os.path.basename(split_path[0]))
검사 결과 모두 하나의 함수를 통해 OS 종류 및 반품하십시오 결합할 수 있습니다.
S # 39, here& 삼중평균 OS 에 관계없이 모든 OS 를 이용할 수 있는 솔루션을 regex 국한됨 것 같다.
다른 어떤 모듈에서는 요구되는가, 아니 전처리 요구되는가 인컨텍스트:
import re
def extract_basename(path):
"""Extracts basename of a given path. Should Work with any OS Path on any OS"""
basename = re.search(r'[^\\/]+(?=[\\/]?$)', path)
if basename:
return basename.group(0)
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']
print([extract_basename(path) for path in paths])
# ['c', 'c', 'c', 'c', 'c', 'c', 'c']
extra_paths = ['C:\\', 'alone', '/a/space in filename', 'C:\\multi\nline']
print([extract_basename(path) for path in extra_paths])
# ['C:', 'alone', 'space in filename', 'multi\nline']
업데이트:
, 파일_이름 필요한 경우에만 가능성이 있는 경우 (즉, '는' c:\windows\ dir / a / b / '은' 등), regex 변경하십시오 다음과 같이 사용된다. 'r& [^ \/] + $ # 39, & # 39 (?! [\/]),'. 시각장애인을 위한 ", 정규 표현식, ". 앞으로 이 긍정적인 변화를 위한 일종의 슬래시 (slash) 에 경로 이름을 룩어헤드 제외어 전달하십시오 룩어헤드, 이로 인해 끝나는 마지막 슬래시 대신 기도하였나니 반환되기를 아무것도아니야 디렉토리 config. 경로명입니다. 물론 보장이 없는 잠재적 파일_이름 실제로 해당 ' () 는 파일이므로 os.path.is_dir os.path.is_file 할 것' 또는 ' ()' 인 것으로 나타났다.
이렇게 하면 해당되어서는 다음과 같습니다.
/a/b/c/ # nothing, pathname ends with the dir 'c'
c:\windows\ # nothing, pathname ends with the dir 'windows'
c:hello.txt # matches potential filename 'hello.txt'
~it_s_me/.bashrc # matches potential filename '.bashrc'
c:\windows\system32 # matches potential filename 'system32', except
# that is obviously a dir. os.path.is_dir()
# should be used to tell us for sure
Here regex 를 테스트할 수 있습니다.
"'파이썬 가져오기의 os
위치 = 오스트발트하드던임 (file_location) # /srv/volume1/data/eds "'
I have never seen 박슬라시드 연산뿐 패스이므로 그들은 기존? 파이썬 모듈 'os' 의 내장 기능 장애가 있는 사람들을 위한. 또 다른 모든 작동합니까 로드패스트너 파스 ':' (), 경고 드리기 주어진다.
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', 'a/./b/c', 'a\b/c']
for path in paths:
os.path.basename(os.path.normpath(path))
Unix 에서 Windows 분리자를 파일_이름 또는 Windows 경로를 수 있습니다. Unix 분리자를 bsbab-unix 경로가 존재하는 할 수 있을 뿐이다. 존재를 나타내는 bsbab-unix 분리자를 비-windows 경로.
스트립 (잘라냅니다 후행 seperator) 는 다음과 같은 특정 OS 에 의해 분할 및 반품하십시오 seperator 관심용 맨 오른쪽 값입니다. # 39 의 it& 추악한, 단순한 가정을 기반으로 한다. 이 경우 추정이 잘못되었습니다 업데이트하십시오 및 내아기마저도 업데이트이 응답 일치시킵니다 더 정확한 로드하십시오.
a.rstrip("\\\\" if a.count("/") == 0 else '/').split("\\\\" if a.count("/") == 0 else '/')[-1]
샘플 코드:
b = ['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']
for a in b:
print (a, a.rstrip("\\" if a.count("/") == 0 else '/').split("\\" if a.count("/") == 0 else '/')[-1])
어쩌면 나의 모든 것 없이 그냥 하나의 솔루션에서 중요한 몇 가지 새로운 (임시 파일을 만들기 위해 이에 트럼프일 d)
import tempfile
abc = tempfile.NamedTemporaryFile(dir='/tmp/')
abc.name
abc.name.replace("/", " ").split()[-1]
값을 가져오는 'abc.name' 을 문자열으로 다음과 같습니다. # 39, & # 39 /tmp/tmpks5oksk7& ',' 그래서 교체할 수 있는 '/' 공간 '그레프리스 (" /" ";; ") '와' 분할되었습니다 호출하여 () '. 내가 있는 바뀌엇어요 반환되므로 내려받습니다 마지막 요소에 목록 '을 (를)' [- 1]
모듈에서는 임포트한 가져올 필요가 없습니다.
다음은 '제발' 솔루션으로 파트리브 완전성을 위해 파이썬 3.2+:
>>> from pathlib import PureWindowsPath
>>> 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']
>>> [PureWindowsPath(path).name for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
이 기능은 Windows, Linux 에서 모두.
파이썬 2 와 3 이 두 가지 모듈을 사용하여, pathlib2:
import posixpath # to generate unix paths
from pathlib2 import PurePath, PureWindowsPath, PurePosixPath
def path2unix(path, nojoin=True, fromwinpath=False):
"""From a path given in any format, converts to posix path format
fromwinpath=True forces the input path to be recognized as a Windows path (useful on Unix machines to unit test Windows paths)"""
if not path:
return path
if fromwinpath:
pathparts = list(PureWindowsPath(path).parts)
else:
pathparts = list(PurePath(path).parts)
if nojoin:
return pathparts
else:
return posixpath.join(*pathparts)
사용법:
In [9]: path2unix('lala/lolo/haha.dat')
Out[9]: ['lala', 'lolo', 'haha.dat']
In [10]: path2unix(r'C:\lala/lolo/haha.dat')
Out[10]: ['C:\\', 'lala', 'lolo', 'haha.dat']
In [11]: path2unix(r'C:\lala/lolo/haha.dat') # works even with malformatted cases mixing both Windows and Linux path separators
Out[11]: ['C:\\', 'lala', 'lolo', 'haha.dat']
본인의 티스트카스:
In [12]: testcase = 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']
In [14]: for t in testcase:
...: print(path2unix(t)[-1])
...:
...:
c
c
c
c
c
c
c
이 아이디어는 슬라이드에서는 내부 표현 ',' 모든 경로를 변환하십시오 꽂으십시오 pathlib2 따라 각기 다른 디코더 통합 플랫폼. 다행히 '일반' 에는 '하는' 푸르파스 pathlib2 디코더 호출됨 작업하거나 경로. 이 경우에 작동하지 않으면 강제 winddows 프롬윈파스 = 진정한 '인식' 를 사용하여 패스를 수 있습니다. 이렇게 하면 입력 문자열 분할합니다 부품으로, 마지막 하나는 찾고, 즉 리프 'path2unix (t) [- 1]'.
경로는 뒤로를 참여하게 될 경우 인수 '노요린 = False' 는 단순히 도왔으매 출력물에는 입력 문자열 변환되었습니다 Unix 형식, 유용할 수 있는 다양한 플랫폼에서 서브패스 비교할 수 있습니다.