Ответ 1
попробовать
w = textwrap.TextWrapper(width=90,break_long_words=False,replace_whitespace=False)
который, казалось, решил проблему для меня
Я работал над тем, что я читал здесь (раньше я никогда не использовал textwrap)
При использовании библиотеки текстовой текстуры 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
(расстояние не точное в моих примерах)
попробовать
w = textwrap.TextWrapper(width=90,break_long_words=False,replace_whitespace=False)
который, казалось, решил проблему для меня
Я работал над тем, что я читал здесь (раньше я никогда не использовал textwrap)
body = '\n'.join(['\n'.join(textwrap.wrap(line, 90,
break_long_words=False, replace_whitespace=False))
for line in body.splitlines() if line.strip() != ''])
Как насчет переноса только строк длиной более 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"
Похоже, он этого не поддерживает. Этот код расширит его, чтобы делать то, что мне нужно:
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)
Мне пришлось с аналогичной проблемой форматировать динамически сгенерированные 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()])
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 не делает ни одного из них - он просто игнорирует существующие строки новой строки, что приводит к странно отформатированному результату)