连接path – 平台独立 – “/”,“\”

在python中我有variablesbase_dirfilename 。 我想连接它们来获得fullpath 。 但在Windows下,我应该使用\和POSIX /

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

如何使平台独立?

重复 : 平台无关的文件path?

你想为此使用os.path.join() 。

使用这种而不是string连接等的强度是,它意识到各种操作系统的具体问题,如path分隔符。 例子:

 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模块包含许多有用的目录,path操作和查找操作系统特定信息的有用方法,例如通过os.sep

使用os.path.join()

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

os.path模块包含了独立于平台的path操作所需的所有方法,但是如果您需要知道当前平台上的path分隔符是什么,则可以使用os.sep

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

在这里挖掘一个老问题,但是在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" 

如果你有幸运行最新版本的Python,它可能比os.path.join()更具可读性。 但是,如果您必须在刚性或传统环境中运行代码,则还要与旧版本的Python进行兼容。

我为此做了一个帮手类:

 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