파이썬에서 경로가 크로스 플랫폼 방식으로 절대 경로인지 상대 경로인지 확인하는 방법은 무엇입니까?


142

UNIX 절대 경로는 '/'로 시작하는 반면 Windows는 알파벳 'C :'또는 '\'로 시작합니다. 파이썬에는 경로가 절대 또는 상대인지 확인하는 표준 기능이 있습니까?

답변:


207

os.path.isabsTrue경로가 절대 경로가 False아닌 경우 반환 합니다 . 설명서 에는 Windows에서 작동한다고 나와 있습니다 (Linux에서 개인적으로 작동한다는 것을 확인할 수 있습니다).

os.path.isabs(my_path)

1
이 기능은 크로스 플랫폼이 아닙니다. 유닉스 os.path.isabs('c:\\')에서 거짓을 반환합니다.
anatoly techtonik

69
Rotfl은 Unix 시스템에서 C : \\가 절대 경로가 아니기 때문에 False를 반환해야합니다. 유닉스 플랫폼의 절대 경로는 "/ var / custApp /"등과 같이 "/"로 시작합니다. :)
Marek Lewandowski

29
@techtonik 다른 사람들에게 이것을 명확하게 밝히기 위해 :`c : \`는 유닉스에서 완벽하게 유효한 파일 / 디렉토리 이름입니다. 따라서 실제로 유닉스 시스템의 상대 경로입니다. 따라서이 기능은 크로스 플랫폼입니다. Windows와 Unix의 특산품을 고려하기 때문입니다.
Lemming

1
바로 그거죠. 다른 플랫폼에서 동일하게 작동하지 않으며 현재 플랫폼에 대한 정답을 제공합니다.
Kevin Cox

질문에 대답하지 않습니다. 크로스 플랫폼 규칙을 사용하려면 'os.path'대신 'ntpath'또는 'posixpath'를 사용하십시오
Shoham

43

그리고 당신이 정말로 원하는 것이 절대 경로라면, 그것이 있는지 확인하기 위해 귀찮게하지 마십시오 abspath.

import os

print os.path.abspath('.')

7
그것은 원래의 질문에 대답하지 않았을 수도 있지만 정확히 그것을 깨닫지 않고 찾고 있었던 것입니다. 감사!
mephisto



5

실제로 위의 답변 중 어느 것도 실제 문제를 해결하지 못했다고 생각합니다 : 크로스 플랫폼 경로. os.path가하는 일은 'path'라이브러리의 OS 종속 버전을로드하는 것입니다. 솔루션은 관련 (OS) 경로 라이브러리를 명시 적으로로드하는 것입니다.

import ntpath
import posixpath

ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
    True
posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
    False

예! 질문은 구체적으로 Windows와 Linux 경로를 모두 언급합니다! 거의 모든 설정에서 작동하는 빠른 원 라이너 : def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel

4

에서 python 3.4 pathlib 사용할 수 있습니다.

In [1]: from pathlib import Path

In [2]: Path('..').is_absolute()
Out[2]: False

In [3]: Path('C:/').is_absolute()
Out[3]: True

In [4]: Path('..').resolve()
Out[4]: WindowsPath('C:/the/complete/path')

In [5]: Path('C:/').resolve()
Out[5]: WindowsPath('C:/')

1
Windows에서이 실제로 대답 작업은 .. Path('\tmp').is_absolute()제대로 제공 False하면서, os.path.isabs('\tmp')잘못 제공합니다 True. (일부는이 주장 할 것이다 \tmpWindows에서 절대 경로입니다,하지만은 매우 쓸모 정의 만 사실 절대 경로 .)
Zbyl

0

다른 방법으로 현재 작업 디렉토리에 없으면 더러워 지지만 그것은 나를 위해 작동합니다.

import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.