在我的机器上使用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\W
和D:\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 :(得分: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'
时,会抛弃a
和b
并从那里建立路径,生成C:\c\d
。