连接path – 平台独立 – “/”,“\”
在python中我有variablesbase_dir
和filename
。 我想连接它们来获得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