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


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.