用os.path.join()构造绝对路径

时间:2013-07-02 15:02:26

标签: python path absolute-path

我想在python中构建一个绝对路径,同时保持对路径分隔符之类的东西的忽视。

edit0:例如我的文件系统/etc/init.d的根目录(或w32上的C:\etc\init.d)上有一个目录,我想只从元素构造它etcinit.d(在W32上,我可能还需要一个磁盘ID,如C:

为了不必担心路径分隔符,os.join.path()显然是首选工具。但似乎这只会创建相对路径:

 print "MYPATH:", os.path.join('etc', 'init.d')
 MYPATH: etc/init.d

添加虚拟第一元素(例如'')对任何事情都没有帮助:

 print "MYPATH:", os.path.join('', 'etc', 'init.d')
 MYPATH: etc/init.d

使第一个元素绝对显然有帮助,但这种方式违背了使用os.path.join()

的想法
 print "MYPATH:", os.path.join('/etc', 'init.d')
 MYPATH: /etc/init.d

edit1:使用os.path.abspath()只会尝试将相对路径转换为绝对路径。 例如考虑在工作目录/home/foo中运行以下内容:

 print "MYPATH:", os.path.abspath(os.path.join('etc', 'init.d'))
 MYPATH: /home/foo/etc/init.d

那么,“根”路径的标准跨平台方式是什么?

 root = ??? # <--
 print "MYPATH:", os.path.join(root, 'etc', 'init.d')
 MYPATH: /etc/init.d

edit2:这个问题真的归结为:由于/etc/init.d中的前导斜杠使这条路径成为绝对路径,有没有办法以编程方式构造这个前导斜杠? (我不想假设前导斜杠表示绝对路径)

5 个答案:

答案 0 :(得分:55)

以root身份使用os.sep为我工作:

path.join(os.sep, 'python', 'bin')

Linux:/python/bin

Windows:\python\bin

在混合中添加path.abspath()也会在Windows上为您提供驱动器号,并且仍与Linux兼容:

path.abspath(path.join(os.sep, 'python', 'bin'))

Linux:/python/bin

Windows:C:\python\bin

答案 1 :(得分:3)

我认为您可以使用os.path.normpath。这是我在Windows上获得的内容:

>>> os.path.normpath("/etc/init.d")
'\\etc\\init.d'

我不确定驱动器前缀的正确用途是什么,但我认为将其关闭意味着类似于&#34;继续使用我现在使用的驱动器,&# 34;这可能是你想要的。也许更熟悉Windows的人可以澄清一下?

答案 2 :(得分:2)

所以我提出的解决方案是通过将给定文件跟踪到它的根来构造文件系统的根目录:

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')

答案 3 :(得分:1)

所以你可以检查一下运行os 通过sys.platfrom

在Windows上

>>> sys.platform
'win32'

在linux上

>>> sys.platform
'linux2'

然后

if sys.platform == 'win32':
    ROOT = os.path.splitdrive(os.path.abspath('.'))[0]
elif sys.platform == 'linux2':
    ROOT = os.sep

请注意'linux2'可能无法涵盖所有​​Linux发行版

答案 4 :(得分:-1)

您可以尝试使用os.path.splitdrive获取驱动器/文件系统的名称,然后将其与foo字符串结合使用。

http://docs.python.org/2/library/os.path.html#os.path.splitdrive

类似(未经测试!)

(drive, tail) = os.path.splitdrive(os.getcwd())
os.path.join(drive, 'foo')

应该这样做。