Python原始字符串文字与斜杠-w - r` \ w`

时间:2016-02-19 23:03:34

标签: python string-literals

在我的机器上使用python 2.7.8和3.4时,如果我在原始字符串文字中有反斜杠-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

1 个答案:

答案 0 :(得分:1)

这不是原始的绊倒你的原始字符串;你误解了os.path.join。 <{3}} 假设在组件不以1开头时添加斜杠。如果斜杠已经存在,则将其视为绝对路径的开头,它会丢弃前面的组件并从“开始”再次开始(除了在Windows上,驱动器号)。来自文档:

  

如果组件是绝对路径,则抛弃所有先前的组件,并从绝对路径组件继续连接。

     

在Windows上,遇到绝对路径组件(例如,r'\ foo')时,不会重置驱动器号。如果组件包含驱动器号,则会丢弃所有先前的组件并重置驱动器号。请注意,由于每个驱动器都有一个当前目录,os.path.join(“c:”,“foo”)表示相对于驱动器C上当前目录的路径:(c:foo),而不是c:\ foo

因此预期和正常:

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

在Windows上生成字符串C:\a\b(由于必要的反斜杠转义,其repr将为"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