「/」、「\」を使用したプラットフォームに依存しないパスの連結?


83

Pythonには、変数base_dirとがありfilenameます。それらを連結して取得したいと思いfullpathます。しかし、Windowsの下\では、POSIXに使用する必要があります/

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

このプラットフォームを独立させるにはどうすればよいですか?




回答:


145

これにはos.path.join()を使用します。

文字列の連結などではなくこれを使用することの強みは、パス区切り文字など、OS固有のさまざまな問題を認識していることです。例:

import os

以下の下でのWindows 7

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

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

以下の下でのLinux

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

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

OSのモジュールは、経由パスで使用されるセパレータとしてディレクトリ、パス操作と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()呼び出しを追加すると、相対的なものがある場合はフルパスになります。
martineau 2012

@Andrew Clark、os.sepはWindowsでは「\\」を返しますが、「/」を使用しても機能します。「/」だけ使っても問題ありませんか?
multigoodverse 2015

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()は、より簡単な方法です。
MarcelWaldvogel19年

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で円記号を挿入しませんか?
MarcelWaldvogel19年

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.