混淆反作用和逃避以及使用\ \“

2024-06-02 11:13:59 发布

您现在位置:Python中文网/ 问答频道 /正文

在将字符串写入文本文件之前,我按照以下代码准备字符串:

text = my_dict['key']

# Ensure text is utf-8 formatted
safe_text = text.encode('utf-8', errors='ignore')

# Escape any \ issues
safer_text = str(safe_text).replace('\\', '\\\\').replace('"', '\\"')

# Write to .txt file
text_file = open("Data/output.txt", "w")
text_file.write(safer_text)

我知道\是特殊字符的转义符,所以我解释为safe_text(表示文件路径)中的\\将被{}替换。但是,我不知道为什么代码要用\\"替换{}(因为我不认为{}是需要转义的特殊字符)。但即使是这样,为什么不.replace('"', '\"')而不是{}?。另外,为什么我们不能简单地将包含\\"safe_text直接写入output.txt(即跳过safer_text的步骤)?在

谢谢。在


Tags: key字符串代码texttxtoutputmydict
2条回答

"可以转义,但是如果它在一个由'包围的字符串中,而不是{},则不必转义。因此,Python将分别用\"和{}替换{}和{},而不管模式是在单引号还是双引号字符串中找到的。在

这样,像'\''这样的字符串等价于双引号的等价物"\'"。如果这不是真的,字符串的内容可能会根据它是单引号还是双引号而改变,这至少是不可取的。在

至于你的第二个问题,如果不看一下你的文件格式,我就不能肯定,因为有些格式需要转义某些字符。当然,它可以是任何格式,因为扩展名是.txt。这取决于代码的作者希望如何读取数据。在

实际上,所有这些转义只有在最终文本文件的使用情况下才有意义。在

如果只是存储纯文本,这些都没有意义。在

在python源代码中键入字符串文本(即'"分隔“.py”文件中实际程序文本中的字符串)时,需要使用任何\的转义和额外转义。这是因为在将“.py”文件中的文本编译为字节码(“pyc”文件中的内容)时,编译器希望知道您是指换行符-当字符串中有“\n”或两个字符序列、反斜杠和字母“n”时,您必须键入"\\n"或{}(注意r前缀)。在

超过这一点,所有的字符串都是计算机内存中的数据,并且字符串包含字符-由于转义而进行的任何转换都已经发生。Python将转换返回,也就是说,如果打印出字符串的repr,则打印出额外的转义反斜杠(但如果只将其打印为字符串,则不会打印)。在

如果将此数据存储到文本文件中,则通过文本编码对其进行编码,在本例中为“utf-8”—但在将文本从文件读回Python程序时,转义符将不适用-文件中的字节将被解码,而字符将再次成为内存中的数据。在

因此,对于程序中字符串文本中的\'或{}序列,Python只会做一些显而易见的事情,在一个特定的ca中,显而易见的是“尽其所能地逃跑”,即使这很可怕。:-)

简单的一点是,任何非原始字符串文本中的\'\"始终只意味着引号字符'和{}。(原始字符串是以r"r'开头的字符串。当字符串用另一种引号或任何类型的三重引号括起来时,就不需要这种转义了——对于语言解析器来说,它是多余的,因为乍一看对人类来说是多余的。所以,这就是显而易见的好的部分:' "apples" '和{}和{}都是表示字符串文本中完全相同的字符的方法。在

我前面提到的“丑陋”是指原始弦的特殊性。在原始字符串中,几乎所有“\”字符的出现都是按字面意思处理的,不会发生转义。但是有两个异常:即使在原始字符串中,序列\'\"也是引号字符的转义序列。在原始字符串中出现的所有其他“\”都是按字面意思理解的。这意味着在Python代码中不可能只使用\字符来结束原始字符串文本(这对于在程序代码中键入Windows文件路径的人来说是相当不幸的): r"C:\Program Files\"是一个“未终止的字符串文本”。键入this的方法之一是do r"C:\Program Files" "\",因为相邻的字符串文本(raw或not)在编译时作为单个字符串连接起来。在

但是,所有这些关于转义引号的离题说法只适用于源Python文件中的文本,而要用作数据的txt文件根本不需要任何转义。在

TL;TR:只有当您直接生成Python代码文本文件,或者生成具有类似转义需求的另一种语言的代码时,才应该转义这些字符。否则,这只会损坏您的数据与额外的字符。在

相关问题 更多 >