在Windows上運行於Python 2.7.10上。python isabs無法將Windows UNC路徑識別爲絕對路徑
> os.path.isabs(r"\\\unc_path\file")
False
> os.path.isabs(r"\\\unc_path\")
False
這是故意的嗎?
在Windows上運行於Python 2.7.10上。python isabs無法將Windows UNC路徑識別爲絕對路徑
> os.path.isabs(r"\\\unc_path\file")
False
> os.path.isabs(r"\\\unc_path\")
False
這是故意的嗎?
您需要注意字符串轉義,通常使用\
。
例如\n
是換行符號。 \\
產生單斜槓\
。
因此,字符串"\\something"
將打印爲\something
。
如果您想要內容\\something
您需要鍵入\\\\something
,即雙任何反斜槓。或者,您可以使用原始字符串:r"\\something"
也可以使用。你不能在那裏再輸入一個換行符,但是你的路徑名中沒有它們。
因此,您鍵入的路徑名稱可能不是您認爲的那樣。 \
是一個特殊的字符,不幸的是微軟在DOS時代認爲這將是一個很好的角色,用作路徑分隔符。 Unix操作系統(其中大多數編程語言和使用\
escape character的約定始發)使用正斜槓/
,這是沒有問題的。
os.path.isabs
如果在\\server\share
部件後面存在某些路徑信息(即使只是一個斜槓),它將只返回一個UNC路徑的True
。
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
,Windows實現的os.path
,它看起來像這樣:
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:/目錄」) 返回(「C:」,「/目錄」)
如果路徑中包含一個UNC路徑,該drive_or_unc將包含 主機名和共享直到但不包括第四個目錄 分隔符。例如splitdrive( 「//主機/電腦/目錄」)返回 ( 「//主機/計算機」, 「/目錄」)
所以......
>>> 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
請提供您正在測試的字面路徑名。您列出的路徑不是UNC路徑,因爲它們不帶有雙反斜線。 –
難道你不需要一個設備來做出絕對的? 'os.path.isabs(r「c:\ unc_path \ file」)'或os.path.isabs(r「\\ unc_path \ file」) – Vatine
此外,請參閱[此處]的註釋(https:// docs。 python.org/2/library/os.path.html#module-os.path):「*注意在Windows上,許多這些函數不能正確支持UNC路徑名。*」 –