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

uml*_*ute 42 python path absolute-path

我想在python中构造一个绝对路径,同时保持对路径分隔符之类的东西的相当遗忘.

edit0:比如有我的文件系统的根目录/etc/init.d(或C:\etc\init.dW32上),我想只从要素建设这个etcinit.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

  • 似乎可以在Linux和Win上使用,因此+1。但是*感觉*错了。在其他一些晦涩的系统上可能会中断,但我认为没有。仍然感觉像python应该给我们一种明确的方式来做到这一点。这取决于以路径分隔符开头的绝对路径。 (2认同)

uml*_*ute 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')
Run Code Online (Sandbox Code Playgroud)