【问题标题】:Confusion between backlash \ and escape \ and the use of \\"backlash \ 和 escape \ 之间的混淆以及 \\" 的使用
【发布时间】:2019-08-14 01:10:42
【问题描述】:

在将字符串写入文本文件之前,我按照此代码准备了一个字符串:

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('"', '\"') 而不是.replace('"', '\\"')?。还有,为什么不能简单地将包含\\"safe_text直接写到output.txt中(也就是跳过safer_text这一步)?

谢谢。

【问题讨论】:

    标签: python string text


    【解决方案1】:

    " 可以被转义,但如果它位于由'而不是"包围的字符串中,则不必这样做。因此,Python 将分别用 \"\' 替换 \"\',无论模式是在单引号还是双引号字符串中找到。

    这样'\'' 之类的字符串就等同于双引号中的等价物"\'"。如果这不是真的,则字符串的内容可能会根据它是单引号还是双引号而改变,至少可以说这是不可取的。

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

    【讨论】:

    • @Jason 通过 can,我的意思是您可以选择是否要转义它(仅在单引号字符串中,在双引号字符串中是必需的)。同样,我不确定作者想要转义的内容是什么,但我最好的猜测是该格式对于 " 和 `\` 具有特殊含义,并且如果您的字面意思是该字符,则需要前面的反斜杠。 (具有讽刺意味的是,由于转义,我现在在此评论的代码块中显示单个反斜杠时遇到问题!)我希望这很清楚,如果不是,我可以在我的答案中添加一个示例。
    • 谢谢,@iz_。我想我明白你的意思,但整个事情太复杂了,我无法完全理解。我想你是对的,这取决于作者的意图如何写safer_text。实际上作者将safer_text 写入数据库。我将其更改为写入.txt 文件。因为我的问题取决于很多条件,所以可以用不同的方式回答。因此,基于对代码作者真实意图的假设,我现在接受您的回答。但是,我非常感谢其他人仍然为我的未决问题提供他们的见解。
    【解决方案2】:

    实际上,所有这些转义仅根据最终文本文件的使用情况才有意义。

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

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

    此时所有字符串都是计算机内存中的数据,并且字符串包含字符 - 由于转义而导致的任何转换都已经发生。 Python 将 transform back,即,如果您打印出字符串的 repr,则打印额外的转义反斜杠(但如果您仅将其打印为字符串,则不会)。

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

    因此,对于程序中字符串文字中的\'\" 序列,Python 只是做了显而易见的事情,在一个特定的案例中,显而易见的是“尽其所能”,即使是可怕。 :-)

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

    我之前提到的“丑陋”的事情是关于原始字符串的特殊性。在原始字符串中,几乎所有出现的“\”字符都按字面意思表示,不会发生转义。但是有两个例外:即使在原始字符串中,序列\'\" 引号字符的转义序列。原始字符串中出现的所有其他“\”都按字面意思表示。这意味着不可能在 Python 代码中用唯一的 \ 字符结束原始字符串文字(这对于在程序代码中键入 Windows 文件路径的人来说是相当不幸的) : r"C:\Program Files\" 是“未终止的字符串文字”。键入此内容的方法之一是执行r"C:\Program Files" "\",因为相邻的字符串文字(无论是否原始)在编译时连接为单个字符串。

    但同样,所有这些关于转义引号的题外话都只适用于源 Python 文件中的文本,而打算用作数据的 txt 文件根本不需要任何转义。

    TL;TR:唯一应该转义这些字符的上下文是,如果您是直接生成 Python 代码文本文件,或者为具有类似转义需求的另一种语言的代码。否则,这只会​​用多余的字符损坏您的数据。

    【讨论】:

    • 谢谢,@jsbueno。澄清一下:您的意思是 \'\" 在程序文本中分隔字符串?您能否提供一些(甚至是人为的)这些场景的示例?
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2016-09-22
    • 2015-06-01
    • 2020-01-08
    • 2012-10-21
    • 2011-09-22
    • 2013-01-03
    • 2012-06-23
    相关资源
    最近更新 更多