在python中,我有变量base_dir
和filename
。我想将它们连接起来以获得fullpath
。但是在Windows下我应该使用\
和POSIX /
。
fullpath = "%s/%s" % ( base_dir, filename ) # for Linux
如何使其与平台无关?
答案 0 :(得分:110)
您希望使用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'
在路径中使用的分隔符
答案 1 :(得分:20)
import os
fullpath = os.path.join(base_dir, filename)
os.path模块包含平台无关路径操作所需的所有方法,但是如果您需要知道当前平台上的路径分隔符,可以使用os.sep
。< / p>
答案 2 :(得分:6)
import os
path = os.path.join("foo", "bar")
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed.
答案 3 :(得分:5)
在这里挖掘一个旧问题,但在Python 3.4+上你可以使用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"
如果您有幸运行最新版本的Python,它可能比os.path.join()
更具可读性。但是,如果您必须在严格或遗留的环境中运行代码,那么您还需要与旧版本的Python进行权衡。
答案 4 :(得分: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
答案 5 :(得分: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)