2012-06-06 4 views
36

파이썬에는 변수 base_dirfilename이 있습니다. 나는 그들을 연결하여 fullpath을 얻고 싶습니다. 하지만 윈도우에서는 \을, POSIX는 /을 사용해야합니다.경로 연결 - 플랫폼 독립적 - "/", ""

fullpath = "%s/%s" % (base_dir, filename) # for Linux 

플랫폼을 독립적으로 만드는 방법은 무엇입니까?

중복는 : Platform-independent file paths?

+0

가능한 [플랫폼 독립적 파일 경로?] (http://stackoverflow.com/questions/6036129/platform-independent-file-paths) –

답변

72

이에 대한 os.path.join()을 사용하고 싶습니다.

문자열 연결 등이 아니라 강도를 사용한다는 것은 경로 구분 기호와 같은 다양한 OS 관련 문제를 인식하고 있다는 것입니다. 예 :

import os 

윈도우 7 에서 :

base_dir = r'c:\bla\bing' 
filename = r'data.txt' 

os.path.join(base_dir, filename) 
'c:\\bla\\bing\\data.txt' 

리눅스 에서 :

base_dir = '/bla/bing' 
filename = 'data.txt' 

os.path.join(base_dir, filename) 
'/bla/bing/data.txt' 

os 모듈 디렉토리 경로 조작 및 OS를 찾는 많은 유용한 메소드를 포함를 통해 경로에 사용되는 구분 기호와 같은 특정 정보

+3

중복 가능한 Windows에도 슬래시를 사용할 수 있습니다. – multigoodverse

17

사용 os.path.join()는 :

import os 
fullpath = os.path.join(base_dir, filename) 

os.path 모듈은 플랫폼 독립적 인 경로 조작에 필요한해야하는 모든 메소드가 포함되어 있지만 경우에 당신은 경로 구분자는 당신이 할 수있는 현재의 플랫폼에 무엇인지 알 필요가 os.sep을 사용하십시오.

import os 

class u(str): 
    """ 
     Class to deal with urls concat. 
    """ 
    def __init__(self, url): 
     self.url = str(url) 

    def __add__(self, other): 
     if isinstance(other, u): 
      return u(os.path.join(self.url, other.url)) 
     else: 
      return u(os.path.join(self.url, other)) 

    def __unicode__(self): 
     return self.url 

    def __repr__(self): 
     return self.url 

사용법은 다음과 같습니다 :

+1

'base_dir '이 상대 경로 (OP가 그것을 사용함에도 불구하고) 인 경우 전체 경로가 아님 – jfs

+1

'abspath()'호출을 추가하면 상대 경로가 있으면 절대 경로가되어야합니다. – martineau

+0

@Andrew Clark, os.sep는 Windows에서 "\\"를 반환하지만 "/"를 사용하더라도 여전히 작동합니다. 우리가 단지 "/"를 사용하면 문제가 있습니까? – multigoodverse

3
import os 
path = os.path.join("foo", "bar") 
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed. 
0

나는 이것에 대한 도우미 클래스를 만들었

a = u("http://some/path") 
    b = a + "and/some/another/path" # http://some/path/and/some/another/path 
2

여기에 오래된 질문을 파고 있지만, 파이썬에 당신이 사용할 수있는 3.4 이상 pathlib operators :

from pathlib import Path 

# evaluates to ./src/cool-code/coolest-code.py on Mac 
concatenated_path = Path("./src")/"cool-code\\coolest-code.py" 

당신이 최신 버전의 Python을 실행하기에 충분하다면 잠재적으로 os.path.join()보다 읽기 쉽다. 하지만, 예를 들어 강체 또는 레거시 환경에서 코드를 실행해야하는 경우 이전 버전의 Python과의 호환성도 상쇄됩니다.

관련 문제