我有一个包含双引号和反斜杠的字符串,我想在Python中设置一个变量.但是,每当我尝试设置它时,引号或斜杠都会被删除或转义.这是一个例子:
>>> foo = 'baz "\"'
>>> foo
'baz ""'
Run Code Online (Sandbox Code Playgroud)
所以,而不是baz "\"像我想要的那样baz "".如果我然后试图逃避反斜杠,它也没有帮助:
>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'
Run Code Online (Sandbox Code Playgroud)
现在哪个符合我的要求但不是我原本想要的.你是如何解决这个问题的?
Cha*_*ffy 74
你被输出误导了 - 你正在采取的第二种方法实际上做了你想要的,你只是不相信它.:)
>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'
>>> print foo
baz "\"
Run Code Online (Sandbox Code Playgroud)
顺便说一下,还有另一种字符串形式可能更清楚一点:
>>> print r'baz "\"'
baz "\"
Run Code Online (Sandbox Code Playgroud)
Har*_*mbe 27
使用原始字符串:
>>> foo = r'baz "\"'
>>> foo
'baz "\\"'
Run Code Online (Sandbox Code Playgroud)
请注意,虽然它看起来不对,但它确实是正确的.字符串中只有一个反斜杠foo.
发生这种情况是因为当您只是foo在提示符处键入时,python会__repr__()在字符串上显示结果.这导致以下内容(注意只有一个反斜杠,并且printed字符串周围没有引号):
>>> foo = r'baz "\"'
>>> foo
'baz "\\"'
>>> print foo
baz "\"
Run Code Online (Sandbox Code Playgroud)
让我们继续前进,因为有更多的反斜杠技巧.如果你想在字符串的末尾加一个反斜杠并使用上面的方法,你会遇到一个问题:
>>> foo = r'baz \'
File "<stdin>", line 1
foo = r'baz \'
^
SyntaxError: EOL while scanning single-quoted string
Run Code Online (Sandbox Code Playgroud)
执行此操作时,原始字符串无法正常工作.你必须使用常规字符串并转义反斜杠:
>>> foo = 'baz \\'
>>> print foo
baz \
Run Code Online (Sandbox Code Playgroud)
但是,如果您正在使用Windows文件名,那么您会遇到一些痛苦.你想要做的是使用正斜杠和os.path.normpath()函数:
myfile = os.path.normpath('c:/folder/subfolder/file.txt')
open(myfile)
Run Code Online (Sandbox Code Playgroud)
这将节省大量的逃避和头发撕裂. 这个页面在前一段时间内很方便.
Harley 所说的,除了最后一点 - 在调用 open 之前实际上没有必要将 '/' 更改为 '\'s。Windows 很乐意接受带有正斜杠的路径。
infile = open('c:/folder/subfolder/file.txt')
Run Code Online (Sandbox Code Playgroud)
您可能需要字符串 normpathed 的唯一时间是您通过 shell(使用os.system或subprocess模块)传递给另一个程序。