我想使用repr()
来获取Python编码的字符串文字(我可以将其粘贴到某些源代码中),但是我更希望使用带三引号的带有真实换行符的字符串,而不是{{1 }}转义序列。
我可以对字符串进行后处理,以将\n
转换为换行符并添加更多引号,但是如果源中有\n
,那么我就不想匹配
最简单的方法是什么?
示例输入:
\\n
或作为Python字符串:
foo
bar
所需的输出:
'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()
。
目标是,如果将其粘贴回Python源文件中,则会得到与读入完全相同的内容。
我正在使用Python 2.7.14
答案 0 :(得分:2)
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和字节输入也是如此。
答案 1 :(得分:0)
将文本文件转换为可粘贴到源代码中的字符串的最终解决方案:
#!/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()
警告:它将覆盖源文件。我为此使用了临时文件,所以这就是我想要的。
信用: