"/", "\"를 사용한 플랫폼 독립적 경로 연결?


86

파이썬에는 변수 base_dirfilename. 나는 그것들을 연결하여 fullpath. 그러나 창문 아래 \에서 POSIX를 사용해야합니다 /.

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

이 플랫폼을 어떻게 독립적으로 만들 수 있습니까?




답변:


150

이를 위해 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.sep을


26

사용 os.path.join():

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

을 os.path의 모듈은 플랫폼 독립적 인 경로 조작에 필요한해야하는 방법이 모두 포함되어 있지만, 경우에 당신은 경로 분리가 사용할 수있는 현재의 플랫폼이 무엇인지 알아야합니다 os.sep.


1
상대 경로 인 경우 전체 경로 가 아닙니다 base_dir(OP가 사용 함에도 불구하고)
jfs

1
abspath()호출을 추가하면 상대가있는 경우 전체 경로가됩니다.
마티

@Andrew Clark, os.sep는 Windows에서 "\\"를 반환하지만 "/"를 사용해도 작동합니다. "/"만 사용하면 문제가 있습니까?
multigoodverse

12

여기에서 오래된 질문을 파헤 치지 만 Python 3.4 이상 에서는 pathlib 연산자를 사용할 수 있습니다 .

from pathlib import Path

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

os.path.join()운이 좋게도 최신 버전의 Python을 실행하는 것보다 잠재적으로 더 읽기 쉽습니다. 그러나 경직된 환경이나 레거시 환경에서 코드를 실행해야하는 경우 이전 버전의 Python과의 호환성도 절충합니다.


나는 아주 좋아 pathlib합니다. 그러나 Python2 설치에서는 기본적으로 설치되지 않는 경우가 많습니다. 사용자가 pathlib를 설치하지 않아도되게 os.path.join()하려면 더 간단한 방법입니다.
Marcel Waldvogel 19-06-16

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

1

이에 대한 도우미 클래스를 만들었습니다.

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

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

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

Windows에서 백 슬래시를 삽입하지 않습니까?
Marcel Waldvogel 19-06-16

0

감사합니다. fbs 또는 pyinstaller 및 고정 앱을 사용하여 이것을 보는 다른 사람을 위해.

이제 완벽하게 작동하는 아래를 사용할 수 있습니다.

target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite_example.db")

나는 분명히 이상적이지 않은 이전에이 모호함을하고 있었다.

if platform == 'Windows':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "\\" + "sqlite_example.db")

if platform == 'Linux' or 'MAC':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "/" + "sqlite_example.db")

target_db_path = target_db
print(target_db_path)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.