当我将Windows路径指定为字典中的值时,将添加反斜杠。
我确实尝试使用原始字符串。
p = "c:\windows\pat.exe"
print p
c:\windows\pat.exe
d = {"p": p}
print d
{'p': 'c:\\windows\\pat.exe'}
Tried it as raw string
d = {"p": r"%s" % p}
print d
{'p': 'c:\\windows\\pat.exe'}
我不希望在分配给字典中的值时添加反斜杠。
答案 0 :(得分:4)
这是在Python新手中很常见的错误。
TL; DR:
>>> print "c:\windows\pat.exe" == 'c:\\windows\\pat.exe'
True
说明:
在第一个实例中,您要为字符串p
分配一个值,然后打印p
,Python将获取要打印的字符串,并通过输出其文字值来实现。在您的示例中:
>>> p = "c:\windows\pat.exe"
>>> print p
c:\windows\pat.exe
在Python 3中,相同:
>>> p = "c:\windows\pat.exe"
>>> print(p)
c:\windows\pat.exe
在第二种情况下,由于您正在创建然后打印字典,因此Python要求字典自行打印。这样做是通过打印自己的简短Python代码表示形式来完成的,因为没有标准的简单方法可以打印字典,就像对于具有简单类型(如字符串或数字)的变量一样。
在您的示例中(经过稍作修改以单独工作):
>>> d = {"p": "c:\windows\pat.exe"}
>>> print d
{'p': 'c:\\windows\\pat.exe'}
那么,为什么Python代码表示中的p
的值具有双反斜杠?因为字符串文字中的单个反斜杠含义不明确。在您的示例中,恰好发生\w
和\p
在Python中没有特殊含义的情况。但是,您可能已经看到\n
和\t
之类的东西用在字符串中来表示换行符或制表符。
例如:
>>> print "Hello\nworld!"
Hello
world!
那么,Python如何知道何时需要何时打印换行以及何时按字面意义打印\n
?没有。它只是假设如果\
之后的字符不构成特殊字符,则您可能想编写一个\
,如果是,则要编写特殊字符。如果您想写一个\
,无论后面如何写,都需要在另一个字符后面跟上转义符(在这种情况下,就是\
的称呼)。
例如:
>>> print "I can see \\n"
I can see \n
那样,就不会有歧义,Python会确切地知道要使用什么。您应始终在普通字符串文字中将反斜杠写为双反斜杠,而不是依靠运气来避免使用诸如\n
或\t
之类的控制字符。这就是为什么Python在打印其代码版本的字符串"c:\windows\pat.exe"
时更喜欢将其写为'c:\\windows\\pat.exe'
的原因。使用单引号,即使使用双引号也可以,但最好还是使用双反斜杠。
这就是代码编写的方式,“真的”您的字符串只有一个反斜杠,引号当然根本就不包含在其中。
如果您不想写双反斜杠,可以考虑使用“原始字符串”,即在字符串前加上r
或R
,告诉Python忽略特殊字符并采用完全与代码中编写的字符串相同:
>>> print r"This won't have \n a line break"
This won't have \n a line break
但是要当心!如果您希望字符串中的最后一个字符为\
的奇数,则此方法不起作用,原因不值得一探。在这种情况下,除了写带有双反斜杠的字符串,您别无选择:
>>> print r"Too bad\"
File "<stdin>", line 1
print r"Too bad\"
^
SyntaxError: EOL while scanning string literal
>>> print r"Too bad\\"
Too bad\\
>>> print "Too bad\\"
Too bad\
答案 1 :(得分:1)
也许这不是问题,因为当您打印值(而不是整个字典)时,字符串将带有一个反斜杠
p = "c:\windows\pat.exe"
d = {"p": p}
print (d)
{'p': 'c:\\windows\\pat.exe'}
for i in d:
print("key:", i, " value:", d[i])
输出
{'p': 'c:\\windows\\pat.exe'}
key: p value: c:\windows\pat.exe
>>>