programing

Python과 교차 플랫폼 방식으로 경로가 절대 경로인지 상대 경로인지 확인하는 방법은 무엇입니까?

i4 2023. 6. 5. 23:37
반응형

Python과 교차 플랫폼 방식으로 경로가 절대 경로인지 상대 경로인지 확인하는 방법은 무엇입니까?

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

os.path.isabs돌아온다True경로가 절대적이라면,False아니라면.설명서에는 Windows에서 작동한다고 나와 있습니다(Linux에서 작동하는지 확인할 수 있습니다).

os.path.isabs(my_path)

그리고 만약 당신이 정말로 원하는 것이 절대적인 경로라면, 그것이 맞는지 확인하는 것을 귀찮아하지 말고, 그냥 그것을 얻으세요.abspath:

import os

print os.path.abspath('.')

부터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:/')

사용합니다.

import os.path

os.path.isabs('/home/user')
True

os.path.isabs('user')
False

사실 저는 위의 답변 중 어느 것도 실제 문제인 크로스 플랫폼 경로를 다루지 않았다고 생각합니다.os.path가 하는 일은 OS 의존 버전의 'path' 라이브러리를 로드하는 것입니다. 따라서 솔루션은 관련 (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

@Zbil DOS에서 결과 경로는 다른 현재 디렉터리에 대해 변경되지 않으므로 절대 경로입니다.결과 경로가 현재 드라이브와 비교하여 바뀌기 때문에 가능하다고 생각합니다!

이것은 드라이브당 현재 디렉터리가 다른 DOS에서 남아 있습니다.

다른 현재 드라이브를 선택하면 현재 디렉터리가 암시적으로 변경됩니다.예를 들어, 저는 방금 "CD"(pwd의 도스 등식)를 했습니다.

* CD
C:\Windows\System32

그런 다음 현재 드라이브를 변경합니다.

* t:
T:\

예상치 못한 경우 이 값이 맞습니다.현재 26개의 디렉터리가 기억나지 않기 때문에 저는 이것을 사용하지 않습니다.

또한 CD가 "파손"되어 있습니다.

T:\ * cd c:\Windows 
T:\

현재 디렉터리(on:)는 변경되지 않지만 C: 현재 드라이브를 변경하면 다음을 확인할 수 있습니다.

T:\ * c:
c:\Windows *

항상 pushd를 사용하여 드라이브와 디렉토리를 변경합니다.

T:\ * pushd c:\Windows\assembly                                                                                                                                                                                                     
c:\Windows\assembly * 

네트워크 공유에 볼륨이 없기 때문에 현재 디렉터리를 설정할 수 있는 명확한 방법이 없습니다.푸쉬드는 방법을 알아요.만약 당신이 무언가를 한다면,

pushd \\myhost\myshare\folder

DOS/Windows는 공유를 사용 가능한 마지막 드라이브 문자(일반적으로 Z)에 매핑합니다.그런 다음 지정한 폴더로 변경합니다.이는 배치 파일 위치로 설정된 현재 디렉터리를 사용하여 실행해야 하는 배치 파일의 경우 특히 중요합니다.이를 위해 많은 배치 파일을 다음과 같이 시작합니다.

SETLOCAL EnableExtensions
pushd "%~dp0"

SETLOCAL은 배치 파일 끝에 새 매핑된 볼륨이 매핑 해제되도록 합니다.그렇지 않으면 볼륨 문자가 빠르게 부족해질 수 있습니다.

당신은 할 수 .os 는또.pathlib도서관

용사를 합니다.os

>>> from os.path import isabs
>>> isabc("./")
False
>>> isabc("C:/")
True

용사를 합니다.pathlib

>>> from pathlib import Path
>>> Path("./").is_absolute()
False
>>> Path("C:/").is_absolute()
True

하지만 @Shoham이 그의 대답에서 말했듯이 https://stackoverflow.com/a/41846670/14475596 .
사실 저는 위의 답변 중 어느 것도 실제 문제인 크로스 플랫폼 경로를 다루지 않았다고 생각합니다.os.path가 하는 일은 OS 의존 버전의 'path' 라이브러리를 로드하는 것입니다. 따라서 솔루션은 관련 (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

만약 당신이 현재 작업 디렉토리에 있지 않다면, 약간 더럽지만 저에게는 효과가 있는 다른 방법입니다.

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

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)

언급URL : https://stackoverflow.com/questions/3320406/how-to-check-if-a-path-is-absolute-path-or-relative-path-in-a-cross-platform-way

반응형