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()
我仍在尝试找出正则表达式以避免转换转义的 \n
s。
目标是,如果我将其粘贴回 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
我想使用 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()
我仍在尝试找出正则表达式以避免转换转义的 \n
s。
目标是,如果我将其粘贴回 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