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 не делает ни того, ни другого — он просто игнорирует существующие символы новой строки, что приводит к странному форматированию результата)
person
Peter
schedule
24.07.2017