Python repr string w / real newlines - PullRequest
       19

Python repr string w / real newlines

1 голос
/ 29 марта 2019

Я хочу использовать repr() для получения строкового литерала в кодировке Python (который я могу вставить в некоторый исходный код), но я бы предпочел строку с тройными кавычками с реальными символами новой строки, а не escape-последовательность \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()

Я все еще пытаюсь выяснить регулярное выражение, чтобы избежать преобразования сбежавших \n с.

Цель состоит в том, чтобы, если я вставлю это обратно в исходный файл Python, я получу в точности то же самое, что прочитал.


Я использую Python 2.7.14

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Как насчет splitlines it и кодирования каждой строки в отдельности:

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 и байтовым входам.

0 голосов
/ 29 марта 2019

Окончательное решение для преобразования текстового файла в строку, которую вы можете вставить в ваш исходный код:

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

Предупреждение: он перезаписывает исходный файл.Я использую временные файлы для этого, вот что я хотел.

Кредит:

...