python isabs无法将Windows UNC路径识别为绝对路径

时间:2016-01-04 20:23:31

标签: python path

在Windows上运行Python 2.7.10。

> os.path.isabs(r"\\\unc_path\file")
False

> os.path.isabs(r"\\\unc_path\")
False

这是设计吗?

2 个答案:

答案 0 :(得分:0)

您需要注意字符串转义,通常使用\

例如\n是换行符号。 \\会产生单个斜杠\

因此,字符串"\\something"将打印为\something

如果您想要内容 \\something,则需要输入\\\\something,即加倍反斜杠。或者,您可以使用原始字符串r"\\something"也可以使用。你不能再在那里输入换行符了,但是你还是不能在路径名中输入换行符。

因此,您键入的路径名称可能与您认为的不同。 \是一个特殊的角色,不幸的是,在DOS时代,微软认为用作路径分隔符是一个很好的角色。 Unix操作系统(大多数编程语言和使用\ escape character的惯例)使用正斜杠/,这是没有问题的。

答案 1 :(得分:0)

如果在os.path.isabs部分后面有一些路径信息(甚至只是一个斜杠),

True将仅返回\\server\share作为UNC路径。

Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.isabs('\\\\server\\share')
False
>>> os.path.isabs('\\\\server\\share\\')
True

要了解原因,了解isabs只是splitdrive之上的一小部分代码是有帮助的。在ntpathos.path的Windows实现中,它看起来像这样:

def isabs(s):
    """Test whether a path is absolute"""
    s = splitdrive(s)[1]
    return s != '' and s[:1] in '/\\'

splitdrive实现旨在处理带有驱动器号和UNC路径的路径,并在它们之间保持一致。 ntpath.splitdrive的文档说:

  

如果路径包含驱动器号,则drive_or_unc将包含   一切都包括结肠。例如splitdrive(" C:/ DIR&#34)   返回(" c:"," / dir")

     

如果路径包含UNC路径,则drive_or_unc将包含   主机名和共享但不包括第四个目录   分隔符。例如splitdrive(" // host / computer / dir")返回   (" //主机/电脑"," / dir")

所以......

>>> os.path.splitdrive('\\\\server\\share')
('\\\\server\\share', '')

您可以看到isabs将返回False

话虽如此,这种行为在Python 2.7.7和Python 2.7.8之间发生了变化:

Python 2.7.7 (default, Oct 12 2015, 14:42:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.isabs('\\\\server\\share')
True
>>> os.path.isabs('\\\\server\\share\\')
True

更改是在os.path.join中修复bug。我不完全确定Python开发人员是否意识到这对于某些os.path函数来说是一个重大变化,但行为与Python 3.5一致:

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.isabs('\\\\server\\share')
False
>>> os.path.isabs('\\\\server\\share\\')
True