http://example.com/a/b/c/../
을 http://example.com/a/b/
으로 변환하기 위해 os.normpath
을 사용하려고했지만 슬래시를 백 슬래시로 변환하기 때문에 Windows에서 작동하지 않습니다. 이 파일 이름 후 (있는 경우) - 여기Python에서 경로 나 URL을 OS 독립적 인 방식으로 정규화/축소 할 수 있습니까?
답변
는
>>> import urlparse
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/", "../..")
'ftp://domain.com/a/b/'
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/e.txt", "../..")
'ftp://domain.com/a/b/'
urljoin
마지막 /
까지 모든 경로/디렉토리 고려 기억하는 방법이다.
또한 /
을 두 번째 매개 변수에 추가하지 마십시오. 그렇지 않으면 예상 한 결과를 얻지 못할 것입니다.
os.path
모듈은 플랫폼에 따라 다르지만 슬래시 만 사용하는 파일 경로의 경우에는 posixpath,normpath
을 사용할 수 있습니다.
os 모듈에서 채택 "- os.path는 명시 적으로 posixpath를 사용하여 사용자의 경우 posixpath 또는 ntpath 모듈 중 하나입니다.
>>> import posixpath
>>> posixpath.normpath("https://stackoverflow.com/a/b/../c")
'/a/c'
>>>
'posixpath.normpath'는 후행 슬래시를 제거하고 두 개의 초기 슬래시를 허용하는 것과 같이 도움이되지 않습니다. 빈 경로를'.'로 대체합니다. –
어느 urljoin
도 posixpath.normpath
제대로 일을 할. urljoin
은 사용자가 무언가와 조인하도록 강제하며 절대 경로 또는 과도한 ..
을 올바르게 처리하지 않습니다. posixpath.normpath
은 여러 개의 슬래시를 축소하고 후행 슬래시를 제거합니다. 두 가지 모두 URL이 수행해서는 안되는 작업입니다.
다음 함수 RFC 3986에 따른 올바른 방법으로 S 및 .
..
들 모두 취급 URL을 완전히 해결한다.
try:
# Python 3
from urllib.parse import urlsplit, urlunsplit
except ImportError:
# Python 2
from urlparse import urlsplit, urlunsplit
def resolve_url(url):
parts = list(urlsplit(url))
segments = parts[2].split('/')
segments = [segment + '/' for segment in segments[:-1]] + [segments[-1]]
resolved = []
for segment in segments:
if segment in ('../', '..'):
if resolved[1:]:
resolved.pop()
elif segment not in ('./', '.'):
resolved.append(segment)
parts[2] = ''.join(resolved)
return urlunsplit(parts)
다음과 같이 전체 URL에서 호출 할 수 있습니다.
>>> resolve_url("http://example.com/dir/../../thing/.")
'http://example.com/thing/'
URL을 해석 할 때 만들 수있는 고려 사항에 대한 자세한 내용은 a similar answer I wrote earlier on the subject를 참조하십시오.
- 1. OS 독립적 인 C++ 스레딩?
- 2. 플랫폼에 독립적 인 방법으로 클립 보드에 액세스 할 수 있습니까?
- 3. 운영체제 독립적 인 장소에서 파이썬으로 설정 파일로드하기
- 4. 내부 div를 독립적 인 스타일 시트로 표시 할 수 있습니까?
- 5. 시간 경과를 계산하기위한 OS 독립적 인 C 라이브러리?
- 6. Python을 사용하는 OS 독립적 인쇄
- 7. 프로그래밍 방식으로 필터에서 ASP.NET 경로 테이블에 액세스 할 수 있습니까?
- 8. 독립적 인 개인 세션
- 9. 어떻게 안드로이드에서 해상도 독립적 인 카메라 미리보기를 만들 수 있습니까?
- 10. 설치 독립적 인 Visual C++ 프로젝트 속성
- 11. 플랫폼 독립적 인 수학 라이브러리
- 12. 플랫폼 독립적 인 방식으로 JVM에 환경 변수 전달
- 13. 독립적 인 더블 피커
- 14. 언어 독립적 인 방식으로 성능 카운터 값 검색
- 15. 플랫폼에 독립적 인 언어에 단점이 있습니까?
- 16. IDE 독립적 인 수은 리포지토리
- 17. 플랫폼 독립적 인 이클립스 설정
- 18. 로케일 독립적 인 strtod 구현
- 19. 플랫폼 독립적 인 방식으로 노드 집합 기능을 사용하는 방법은 무엇입니까?
- 20. 주소 패밀리에 독립적 인 네트워크 패킷 구조를 가질 수 있습니까?
- 21. 클래스에서 버전 독립적 인 DLL 참조를 가질 수 있습니까?
- 22. 플랫폼 독립적 인 방식으로 무한 값을 선택하는 방법
- 23. 비주얼 스타일 독립적 인 드로잉
- 24. 어떻게 독립적 인 업데이트 패널을 만들 수 있습니까?
- 25. DPI 독립적 인 방식으로 이미지 다운로드 및 표시
- 26. 브라우저 독립적 인 읽기 전용?
- 27. 언어 독립적 인 로직 질문
- 28. Joomla - 독립적 인 SQL 쿼리
- 29. 누구나 코나 나 3.1 경로 질문에 나를 도울 수 있습니까?
- 30. Python에서 str()이 실패 할 수 있습니까?
반대로 : 두 번째 매개 변수에 '/'이 오는 경우'ftp : //domain.com /../ .. '을 반환합니다. 수정. –