在Python字符串文本中引用反斜杠

在Python字符串文本中引用反斜杠,python,string,Python,String,我有一个字符串,其中包含双引号和反斜杠,我想在Python中将其设置为变量。但是,每当我尝试设置它时,引号或斜杠要么被删除,要么被转义。下面是一个例子: >>> foo = 'baz "\"' >>> foo 'baz ""' 因此,我得到的不是我想要的baz“\”,而是baz”“。如果我试图避开反斜杠,也无济于事: >>> foo = 'baz "\\"' >>> foo 'baz "\\"' 现在它和我放进去的相符,

我有一个字符串,其中包含双引号和反斜杠,我想在Python中将其设置为变量。但是,每当我尝试设置它时,引号或斜杠要么被删除,要么被转义。下面是一个例子:

>>> foo = 'baz "\"'
>>> foo
'baz ""'
因此,我得到的不是我想要的
baz“\”
,而是
baz”“
。如果我试图避开反斜杠,也无济于事:

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'

现在它和我放进去的相符,但不是我最初想要的。你是如何解决这个问题的?

你被输出误导了——你所采取的第二种方法实际上是你想要的,你只是不相信而已

顺便说一句,还有一种字符串形式可能更清楚一些:

>>> print(r'baz "\"')
baz "\"
使用原始字符串:

>>> foo = r'baz "\"'
>>> foo
'baz "\\"'
请注意,虽然它看起来是错误的,但实际上是正确的。字符串
foo
中只有一个反斜杠

这是因为当您在提示符下键入
foo
时,python会在字符串上显示
\uuuuu repr\uuuu()
的结果。这会导致以下情况(请注意,
print
ed字符串周围只有一个反斜杠,没有引号):

让我们继续,因为反斜杠的技巧更多。如果您希望在字符串的末尾有一个反斜杠,并使用上面的方法,您将遇到一个问题:

>>> foo = r'baz \'
  File "<stdin>", line 1
    foo = r'baz \'
                 ^  
SyntaxError: EOL while scanning single-quoted string
但是,如果您使用的是Windows文件名,则会遇到一些麻烦。您要做的是使用前斜杠和
os.path.normpath()
函数:

myfile = os.path.normpath('c:/folder/subfolder/file.txt')
open(myfile)

这将节省大量的逃跑和头发撕裂。前一段时间,当我们讨论这个问题时,这很方便。

哈利说的话,除了最后一点——实际上没有必要在调用open之前将“/”改为“\”。Windows很乐意接受带有正斜杠的路径

infile = open('c:/folder/subfolder/file.txt')

只有在通过shell(使用
os.system
子进程
模块)传递到另一个程序时,才可能需要对字符串进行规范化处理。

用反斜杠结束字符串的另一种方法是用反斜杠加空格结束字符串,然后调用
.strip()
字符串上的函数

我试图连接两个字符串变量,并用反斜杠将它们分隔开,因此我使用了以下方法:

newString = string1 + "\ ".strip() + string2

如果您要查看文件路径,只需使用
“\\”


它将输出
c:\file\path

,如果您像上面Charles Duffy那样打印,它将正确显示。当您只执行“foo”时,Python将使用_repr__()函数来显示字符串。它的输出带有一个额外的反斜杠,因此当您将结果分配给变量时,内容将是相同的。Python交互式解释器为
foo='\\'
输出
'\\'
(包括转义字符)是否存在某种错误?,考虑到当您转义其他字符时,我看不到这种类型的输出,例如,
foo='\'“
生成
'”
(没有转义字符)。@JaimeHablutzel,不,这不是一个bug
'“
是一种用单个
字符描述字符串的有效方法,正如
'\”
一样。相比之下,
'\'
不是一种描述单个反斜杠字符的有效方法(因为单个斜杠看起来像是在转义后面的
'
),因此必须对非原始字符串中的单个反斜杠进行转义。请注意,这是特定于windows的。在Linux/macOS上,这将导致
“c:\\file\\path”
。唯一有效的原因是
“\”
不是有效的转义序列,因此反斜杠保留在字符串中。请尝试
“\n”。strip(“n”)
并查看差异。如果下一版本的Python将反斜杠空格定义为有效的单个字符,则此操作将停止工作。
myfile = os.path.normpath('c:/folder/subfolder/file.txt')
open(myfile)
infile = open('c:/folder/subfolder/file.txt')
newString = string1 + "\ ".strip() + string2
import os
path = r"c:\file"+"\\"+"path"
os.path.normpath(path)