2016-02-19 50 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