uml*_*ute 42 python path absolute-path
我想在python中构造一个绝对路径,同时保持对路径分隔符之类的东西的相当遗忘.
edit0:比如有我的文件系统的根目录/etc/init.d(或C:\etc\init.dW32上),我想只从要素建设这个etc和init.d(W32上,我可能还需要一个磁盘ID,如C:)
为了不必担心路径分离器,os.join.path()显然是选择的工具.但似乎这只会创建相对路径:
print "MYPATH:", os.path.join('etc', 'init.d')
MYPATH: etc/init.d
Run Code Online (Sandbox Code Playgroud)
添加虚拟第一元素(例如'')对任何事情没有帮助:
print "MYPATH:", os.path.join('', 'etc', 'init.d')
MYPATH: etc/init.d
Run Code Online (Sandbox Code Playgroud)
使第一个元素绝对显然有帮助,但这种方式违背了使用的想法 os.path.join()
print "MYPATH:", os.path.join('/etc', 'init.d')
MYPATH: /etc/init.d
Run Code Online (Sandbox Code Playgroud)
edit1: using os.path.abspath()只会尝试将相对路径转换为绝对路径.例如,考虑在工作目录中运行以下命令/home/foo:
print "MYPATH:", os.path.abspath(os.path.join('etc', 'init.d'))
MYPATH: /home/foo/etc/init.d
Run Code Online (Sandbox Code Playgroud)
那么,"根"路径的标准跨平台方式是什么?
root = ??? # <--
print "MYPATH:", os.path.join(root, 'etc', 'init.d')
MYPATH: /etc/init.d
Run Code Online (Sandbox Code Playgroud)
edit2:这个问题真的归结为:由于前导斜杠/etc/init.d使得这条路径成为绝对路径,有没有办法以编程方式构造这个前导斜杠?(我不想假设前导斜杠表示绝对路径)
小智 59
os.sep以root身份使用对我有用:
path.join(os.sep, 'python', 'bin')
Run Code Online (Sandbox Code Playgroud)
Linux的: /python/bin
视窗: \python\bin
添加path.abspath()到混合中也会在Windows上为您提供驱动器号,并且仍然与Linux兼容:
path.abspath(path.join(os.sep, 'python', 'bin'))
Run Code Online (Sandbox Code Playgroud)
Linux的: /python/bin
视窗: C:\python\bin
所以我想出的解决方案是通过跟随给定文件到它的根来构建文件系统的根:
def getRoot(file=None):
if file is None:
file='.'
me=os.path.abspath(file)
drive,path=os.path.splitdrive(me)
while 1:
path,folder=os.path.split(path)
if not folder:
break
return drive+path
os.path.join(getRoot(), 'etc', 'init.d')
Run Code Online (Sandbox Code Playgroud)