【问题标题】:Python repr string w/ real newlines带有真正换行符的 Python repr 字符串
【发布时间】:2019-08-19 20:10:22
【问题描述】:

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

我可以对字符串进行后处理以将 \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

【问题讨论】:

  • 不就是print(your_string)吗?我真的没有得到你想要的输入和输出。
  • @wim No. repr 将转义引号、表情符号和其他控制字符,这是我想要的。
  • 好的,请发布一个示例输入和输出。 Btw repr 不会在当前版本的 Python 中转义表情符号 - 也许你应该用 python-2.x 标记它?
  • @wim 已添加到问题中。
  • 您确定要'foo????\nbar' 而不是u'foo????\nbar'?这里正确的转义是 foo\U0001f4a9\nbar - 你在这里显示的是 utf-8 编码

标签: python string repr


【解决方案1】:

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 和 bytes 输入。

【讨论】:

  • 聪明。在调用repr 之前拆分行以避免整个转义问题。
【解决方案2】:

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

#!/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()

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

学分:

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多