Platform independent path concatenation using "/" , ""?

Question:

In python I have variables base_dir and filename. I would like to concatenate them to obtain fullpath. But under windows I should use and for POSIX / .

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

How can I make this platform independent?

Asked By: Jakub M.

||

Answers:

You want to use os.path.join() for this.

The strength of using this rather than string concatenation etc is that it is aware of the various OS specific issues, such as path separators. Examples:

import os

Under Windows 7:

base_dir = r'c:blabing'
filename = r'data.txt'

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

Under Linux:

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

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

The os module contains many useful methods for directory, path manipulation and finding out OS specific information, such as the separator used in paths via os.sep

Answered By: Levon

Use os.path.join():

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

The os.path module contains all of the methods you should need for platform independent path manipulation, but in case you need to know what the path separator is on the current platform you can use os.sep.

Answered By: Andrew Clark
import os
path = os.path.join("foo", "bar")
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed.
Answered By: varunl

I’ve made a helper class for this:

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

The usage is:

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

Digging up an old question here, but on Python 3.4+ you can use 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"

It’s potentially more readable than os.path.join() if you are fortunate enough to be running a recent version of Python. But, you also tradeoff compatibility with older versions of Python if you have to run your code in, say, a rigid or legacy environment.

Answered By: 70by7

Thanks for this. For anyone else who sees this using fbs or pyinstaller and frozen apps.

I can use the below which works perfect now.

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

I was doing this fugliness before which was obviously not ideal.

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)
Answered By: Mik R
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.