Платформа независимая конкатенация пути с использованием "/", "\"?
В питоне у меня есть переменные base_dir
и filename
. Я хотел бы объединить их, чтобы получить fullpath
. Но под Windows я должен использовать \
и для POSIX /
.
fullpath = "%s/%s" % ( base_dir, filename ) # for Linux
Как сделать платформу независимой?
Ответы
Ответ 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