在Windows上运行Python 2.7.10。
> os.path.isabs(r"\\\unc_path\file")
False
> os.path.isabs(r"\\\unc_path\")
False
这是设计吗?
答案 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
之上的一小部分代码是有帮助的。在ntpath
,os.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