2016-02-19 71 views
0

在我的機器上使用python 2.7.8和3.4時,如果我在原始字符串文字中有一個反斜槓-W,它不會被視爲原始數據。這真的是預期的行爲?Python原始字符串文字與斜槓-r-r` w`

import os 
import sys 
wspace = r'D:\Feb-19' 
tile = '116o' 
ex1 = os.path.join(wspace, r'Work_{}\scratch.gdb'.format(tile)) 
ex2 = os.path.join(wspace, r'\Work_{}\scratch.gdb'.format(tile)) 

print(sys.version) 

print('''\n--- Expected --- 
no-slash-W  D:\Feb-19Work_116o\scratch.gdb 
yes-slash-W  D:\Feb-19\Work_116o\scratch.gdb 
''') 

print('''--- Actual Result --- 
no-slash-W  {} 
yes-slash-W  {} 
'''.format(ex1, ex2)) 

結果我從PyScripter和遠程Python解釋器中獲得。備註9W vs 9\WD:\Feb vs D:\Work

2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] 
--- Expected --- 
no-slash-W  D:\Feb-19Work_116o\scratch.gdb 
yes-slash-W  D:\Feb-19\Work_116o\scratch.gdb 

--- Actual Result --- 
no-slash-W  D:\Feb-19\Work_116o\scratch.gdb 
yes-slash-W  D:\Work_116o\scratch.gdb 

...和命令shell的Python 3:

D:\> python broken-raw-string-example.py 
3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] 

--- Expected --- 
no-slash-W  D:\Feb-19Work_116o\scratch.gdb 
yes-slash-W  D:\Feb-19\Work_116o\scratch.gdb 

--- Actual Result --- 
no-slash-W  D:\Feb-19\Work_116o\scratch.gdb 
yes-slash-W  D:\Work_116o\scratch.gdb 

吉斯特在這裏,如果你想在這上面貼叉: https://gist.github.com/maphew/9368fe16df751b016bbd

+0

'os.path.join()'也規範化路徑。它將反斜槓視爲路徑加密器。當它不是*那裏時,它會放在那裏。 – zondo

回答

1

它絆倒你在這裏不是原始的字符串;你誤會了os.path.joinos.path.join假定當組件不以一個開始時添加一個斜槓。如果斜線已經存在,則它被視爲絕對路徑的開始,它放棄了前面的組件,並且從頭開始(除了在Windows上的驅動器盤符之外)。從文檔:

如果某個組件是絕對路徑,則以前的所有組件都將被丟棄,並且從絕對路徑組件繼續連接。

在Windows上,當遇到絕對路徑組件(例如r'\ foo')時,驅動器號不會重置。如果組件包含驅動器號,則以前的所有組件都將被丟棄,並重置驅動器號。請注意,由於每個驅動器都有當前目錄,因此os.path.join(「c:」,「foo」)表示相對於驅動器C上當前目錄的路徑:(c:foo),而不是c:\ foo 。

因此預期和正常的:

os.path.join('C:\a', 'b') 

產生串C:\a\b在Windows(這將是"C:\\a\\b"由於反斜槓的必要逃避再版),而:

os.path.join('C:\a', '\\b') 

'\\b'的意思是「從當前驅動器開始一個新的絕對路徑」,並拋棄\a替換爲\b。同樣,

os.path.join('C:\a', 'b', '\\c', 'd') 

會,當它看到'\\c',扔掉ab,並從那裏建立的路徑,產生C:\c\d