给定两个几乎相同的文本文件(纯文本,在 MacVim 中创建),在 Python 中将它们读入变量时得到不同的结果。我想知道这是为什么以及如何产生一致的行为。
例如,f1.txt 看起来像这样:
This isn't a great example, but it works.
f2.txt 看起来像这样:
This isn't a great example, but it wasn't meant to be.
"But doesn't it demonstrate the problem?," she said.
当我读入这些文件时,使用如下内容:
f = open("f1.txt","r")
x = f.read()
当我查看控制台中的变量时,我得到以下信息。 f1.txt:
>>> x
"This isn't a great example, but it works.\n\n"
和 f2.txt:
>>> y
'This isn\'t a great example, but it wasn\'t meant to be. \n"But doesn\'t it demonstrate the problem?," she said.\n\n'
换句话说, f1 只带有转义的换行符,而 f2 也有它的单引号被转义。
repr() 显示正在发生的事情。首先是 f1:
>>> repr(x)
'"This isn\'t a great example, but it works.\\n\\n"'
和 f2:
>>> repr(y)
'\'This isn\\\'t a great example, but it wasn\\\'t meant to be. \\n"But doesn\\\'t it demonstrate the problem?," she said.\\n\\n\''
这种行为让我发疯。发生了什么,我如何使它保持一致?如果重要的话,我正在尝试以纯文本形式阅读,操作它,并最终将其写出来,以便它显示正确转义的字符(用于粘贴到 Javascript 代码中)。
最佳答案
Python 为您提供了一个字符串文字,如果您将其返回给 Python,将产生相同的字符串。这称为字符串的 repr()
(“表示”的缩写)。这可能不会(实际上可能不会)与最初指定的字符串匹配,因为有很多方法可以做到这一点,并且 Python 不会记录有关它最初是如何指定的任何信息。
它在您的第一个示例周围使用双引号,效果很好,因为它不包含任何单引号。第二个字符串包含双引号,因此它不能使用双引号作为分隔符。相反,它使用单引号并使用反斜杠来转义字符串中的单引号(它不必以这种方式转义双引号,而且双引号的数量比单引号还多)。这使表示尽可能短。
这种行为没有理由让你发疯,也没有必要试图让它保持一致。当您在 Python 的交互模式下查看值时,您只会获得字符串的 repr()
。当您实际使用 print
或以其他方式使用字符串时,您将获得字符串本身,而不是重新构建的字符串文字。
如果你想获得一个 JavaScript 字符串文字,最简单的方法是使用 json
模块:
import json
print json.dumps('I said, "Hello, world!"')
关于python - 为什么在 Python 中读取的文件中单引号的转义不一致?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18924102/