Библиотека текстовой текстуры Python - Как сохранить разрыв строки?

При использовании библиотеки текстовой текстуры Python, как я могу это сделать:

short line,

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

в это:

short line,

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx

Я пробовал:

w = textwrap.TextWrapper(width=90,break_long_words=False)
body = '\n'.join(w.wrap(body))

Но я получаю:

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

(расстояние не точное в моих примерах)

Ответ 1

попробовать

w = textwrap.TextWrapper(width=90,break_long_words=False,replace_whitespace=False)

который, казалось, решил проблему для меня

Я работал над тем, что я читал здесь (раньше я никогда не использовал textwrap)

Ответ 2

body = '\n'.join(['\n'.join(textwrap.wrap(line, 90,
                 break_long_words=False, replace_whitespace=False))
                 for line in body.splitlines() if line.strip() != ''])

Ответ 3

Как насчет переноса только строк длиной более 90 символов?

new_body = ""
lines = body.split("\n")

for line in lines:
    if len(line) > 90:
        w = textwrap.TextWrapper(width=90, break_long_words=False)
        line = '\n'.join(w.wrap(line))

    new_body += line + "\n"

Ответ 4

Похоже, он этого не поддерживает. Этот код расширит его, чтобы делать то, что мне нужно:

http://code.activestate.com/recipes/358228/

Ответ 5

lines = text.split("\n")
lists = (textwrap.TextWrapper(width=90,break_long_words=False).wrap(line) for line in lines)
body  = "\n".join("\n".join(list) for list in lists)

Ответ 6

Мне пришлось с аналогичной проблемой форматировать динамически сгенерированные docstrings. Я хотел сохранить новые линии, вставленные вручную, и разделить любые строки на определенную длину. Перепробовав ответ @far, это решение сработало для меня. Я включаю его здесь только для потомков:

import textwrap

wrapArgs = {'width': 90, 'break_long_words': True, 'replace_whitespace': False}
fold = lambda line, wrapArgs: textwrap.fill(line, **wrapArgs)
body = '\n'.join([fold(line, wrapArgs) for line in body.splitlines()])

Ответ 7

TextWrapper не предназначен для обработки текста, в котором уже есть символы новой строки.

Есть две вещи, которые вы можете сделать, когда у вашего документа уже есть символы новой строки:

1) Сохраняйте старые символы новой строки и ограничивайте только те строки, длина которых превышает лимит.

Вы можете подклассифицировать TextWrapper следующим образом:

class DocumentWrapper(textwrap.TextWrapper):

    def wrap(self, text):
        split_text = text.split('\n')
        lines = [line for para in split_text for line in textwrap.TextWrapper.wrap(self, para)]
        return lines

Затем используйте его так же, как textwrap:

d = DocumentWrapper(width=90)
wrapped_str = d.fill(original_str)

Дает вам:

short line,
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx

2) Удалите старые строки и оберните все.

original_str.replace('\n', '')
wrapped_str = textwrap.fill(original_str, width=90)

Дает вам

short line,  long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

(TextWrapper не делает ни одного из них - он просто игнорирует существующие строки новой строки, что приводит к странно отформатированному результату)