2009-07-11 3 views
11
>>> os.path.basename('http://example.com/file.txt') 
'file.txt' 

.. 그리고 나는 os.path.*이 URL이 아닌 로컬 경로에서만 작동한다고 생각 했습니까? 위의 예제는 Windows에서도 실행되었습니다. 비슷한 결과가 나타납니다.os.path.basename은 URL과 함께 작동합니다. 그 이유는 무엇입니까?

창에
+0

설명 : 나는 왜/왜/작동하는지 (소스 코드가 분명히 갈 길이 멀다.) 묻지 않을 것이다. 왜 나는 그것이 (특히 Windows '\'는 경로 구분자 인) 정책에 의해 왜 작동해야하는지 묻습니다. –

+1

Microsoft OSes는'Dos 2'의 경로 구분자로'/'를 사용합니다. 명령 줄 옵션 플래그 표기법과 충돌하기 때문에'/'는 명령 셸에 의해 비활성화되었습니다 (더 이상은 아닙니다). 이 때문에 많은 구현은 단순히'/'의 유효성을 알지 못합니다. 파이썬은 분명히 있습니다. 또한'\\? \ "접두어에는 슬래시를 사용할 수 없습니다. 소스 http://bytes.com/topic/python/answers/23123-when-did-windows-start-accepting-forward-slash-path-separator 및 http://msdn.microsoft.com/en-us/library /aa365247(VS.85).aspx#paths – n611x007

답변

17

많은 기능 그냥 문자열 조작 함수 (단지 경로 조작에 특히 유용 할 일이있는) - 그리고 공식적으로 "잘못된"말하는 동안 즉, 무해한 때때로 편리 이후,이 의지를 의심 파이썬 3,

$ python -c"import sys; import StringIO; x = StringIO.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print x.getvalue().splitlines()[10][9:]" 

또는 :

$ python -c"import sys; import io; x = io.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print(x.getvalue().splitlines()[10][9:])" 
+4

한 라이너가 매우 인상적이라고 말해야합니다. Windows에서 – sunqiang

+0

: s/'/ "/ g – ars

+0

@ars, tx,"실제로 교차 플랫폼이므로 편집했습니다. @sunqiang, 당신이 그것을 좋아했기 때문에 기쁜! -) –

3

, 소스 코드를 보면 : C : \ Python25 \ lib 디렉토리 \을 (같은 파일의)

def basename(p): 
    """Returns the final component of a pathname""" 
    return split(p)[1] 

os.path.split 단지 분할 "\"(와 STH ntpath.py. 다른)

+0

은 URL에서'os.path.basename'을 사용하고 있습니다. 이런 종류의 정보를 추출 할 수있는 비범 한 방법이 있습니까?아니면'urlpare.urparse ('') .path' 대신 사용해야합니까? – n611x007

+1

@naxa 지연 응답에 대해 유감스럽게 생각합니다. 파이썬이라고 할 수는 없지만 경로/파일 경로를 찾습니다. 기본 "지원"URL도 있습니다. 나는 URL 처리를 위해 urlparse를 선호한다. – sunqiang

2

소스 눅 사용


def basename(p): 
    """Returns the final component of a pathname""" 
    i = p.rfind('/') + 1 
    return p[i:] 

편집 설명에 (응답) :

그것은 우연히 URL을 위해 작동합니다. 그 때문에, 그 행동을 악용하는 것은 코드 냄새라고 여겨 질 수 있습니다. 이 (통과 경로가 URL이 아닌지 확인) "수정"하려고

도 의외로 어려운

www.google.com/test.php 
[email protected]/12 
./src/bin/doc/goto.c 

그래서 http:/hello.txt (하나이며, 동시에 올바른 경로 이름 및 URL (상대)에있다/, 그리고 리눅스에서만, 그리고 그것은 다소 어리 석다 :)). 절대 URL을 위해 "수정"할 수 있지만 상대 URL은 여전히 ​​작동합니다. 다르게 하나의 특별한 경우를 다루는 것은 파이썬 세계에서 큰 문제가 아닙니다.

을 정리해 : 수입이

0

이유는 무엇입니까? URL을 구문 분석하고 로컬 파일 경로를 파싱하는 데 유용하기 때문입니다. 왜 안돼? os.path

실제로
+0

os.path 모듈에 있기 때문에 Windows를 실행하는 경우 OS에서 이해할 수있는 경로가 아닙니다. 경로 분리자는 다릅니다. 나는 /이 유효한 파일 이름 인 URL을 만드는 Windows에서 유효한 파일 이름 문자이며이 동작이 올바르지 않다고 생각합니다. 나는 Windows 사용자가 아니기 때문에이 주석의 일부 또는 전부가 횡설수설 일 수 있습니다. – SpoonMeiser

+1

@SpoonMeiser, 마이크로 소프트의 C 라이브러리 구현은 실제로 /를 유효한 대안으로 사용할 수있게합니다 (OS 자체는 syscall/Win32API 레벨에서 한 단계까지 했었지만 몇 년 전부터는 그렇지 않습니다) ;-). –

+0

@Alex Martelli, 그게 여전히 사실이라면 말이 될 것입니다. – SpoonMeiser

1

Forw 쉘/명령 프롬프트에서 다음과 같은 간단한 한 줄을 사용, 자세한 내용은 - 곧 변경 ard slash는 Windows에서 허용되는 경로 구분 기호입니다.

args 스위치에 해당 문자가 예약되어 있기 때문에 명령 행에서 /로 시작하는 경로를 허용하지 않는 것입니다.

관련 문제