62

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

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

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

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

添加一个虚拟的第一个元素(例如'')没有任何帮助:

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

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

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

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

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

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

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

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

4

5 回答 5

88

os.seproot 身份使用对我有用:

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

Linux:/python/bin

视窗:\python\bin

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

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

Linux:/python/bin

视窗:C:\python\bin

于 2015-01-22T02:41:14.017 回答
4

我认为你可以使用os.path.normpath. 这是我在 Windows 上得到的:

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

我不确定驱动器前缀的正确做法是什么,但我认为将其关闭意味着“继续使用我现在打开的驱动器”,这可能是您想要的。也许更熟悉Windows的人可以澄清一下?

于 2014-12-05T23:37:02.290 回答
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')
于 2013-07-02T16:07:34.113 回答
1

所以你可以通过 sys.platfrom 来检查正在运行的操作系统

在窗户上

>>> 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 发行版

于 2013-07-02T15:19:45.613 回答
-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')

应该做的伎俩。

于 2013-07-02T15:56:57.813 回答