Python 带真实换行符的 repr 字符串

Python repr string w/ real newlines

我想使用 repr() 来获得 Python 编码的字符串文字(我可以将其粘贴到某些源代码中),但我更喜欢带有真正换行符的三引号字符串而不是 \n 转义序列。

我可以 post 处理字符串以将 \n 转换回换行符并添加更多引号,但是如果 \n 在源代码中,那么我不想匹配那个。

最简单的方法是什么?


示例输入:

foo
bar

或作为 Python 字符串:

'foo\nbar'

期望的输出:

'''foo\xf0\x9f\x92\xa9
bar'''

三重单引号或三重双引号很好,但我确实希望它像这样在多行中被打破。


我目前拥有的:

#!/usr/bin/env python
import sys
import re

with open(sys.argv[1], 'r+') as f:
    data = f.read()
    f.seek(0)
    out = "''" + re.sub(r"\n", '\n', repr(data)) + "''"
    f.write(out)
    f.truncate()

我仍在尝试找出正则表达式以避免转换转义的 \ns。

目标是,如果我将其粘贴回 Python 源文件,我将返回与读入完全相同的内容。


我正在使用 Python 2.7.14

如何 splitlines 它并分别编码每一行:

s = 'foo\nbar'

r = "'''" + '\n'.join(repr(x)[1:-1] for x in s.splitlines()) + "'''"

assert eval(r) == s

如果您在 python2 上并且输入是 unicode,那么 repr[2:-1] 也会去除前导 u。这同样适用于 py3 和字节输入。

将文本文件转换为可以粘贴到源代码中的字符串的最终解决方案:

#!/usr/bin/env python
import sys
import re
import io

with io.open(sys.argv[1], 'r+', encoding='utf8') as f:
    data = f.read()
    f.seek(0)
    out = u"u'''" + u'\n'.join(repr(x)[2:-1] for x in data.splitlines()) + u"'''"
    f.write(out)
    f.truncate()

警告:它会覆盖源文件。我正在为此使用临时文件,这就是我想要的。

致谢:

  • Mark