Подтвердить что ты не робот

Платформа независимая конкатенация пути с использованием "/", "\"?

В питоне у меня есть переменные base_dir и filename. Я хотел бы объединить их, чтобы получить fullpath. Но под Windows я должен использовать \ и для POSIX /.

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

Как сделать платформу независимой?

4b9b3361

Ответ 1

Вы хотите использовать os.path.join() для этого.

Сила использования этого, а не конкатенации строк и т.д. заключается в том, что он знает о различных проблемах конкретной ОС, таких как разделители путей. Примеры:

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.sep

Ответ 2

Используйте os.path.join():

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

Модуль os.path содержит все методы, которые необходимо использовать для манипуляций с независимой от платформы манипуляцией, но если вам нужно знать, что разделитель путей находится на текущей платформе, вы можете использовать os.sep.

Ответ 3

Здесь можно найти старый вопрос, но на 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, если вам приходится запускать свой код, скажем, в жесткой или устаревшей среде.

Ответ 4

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

Ответ 5

Я сделал для этого вспомогательный класс:

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