Home > database >  How to align a text in Python without losing paragraphs?
How to align a text in Python without losing paragraphs?

Time:08-31

I am trying to align a text to a certain number of characters per line. I tried textwrap.fill(), but I want to keep my paragraphs, for example, my text is:

Qué momento en el Olímpico de Roma. 
Mou saca a Dybala para una merecida ovación de la hinchada, tras anotar doblete. 
Paulo le besa la mano mientras ambos sonríen. 


Si hay alguien que puede recuperar la mejor versión de la Joya, ese es Mou. 
Sonríe la Roma, sonríe Scaloni.

and I would like something like this:

Qué momento en el Olímpico de Roma. 
Mou saca a Dybala para una 
merecida ovación de la hinchada, 
tras anotar doblete. 
Paulo le besa la mano mientras 
ambos sonríen. 


Si hay alguien que puede recuperar 
la mejor versión de la Joya, ese 
es Mou.

Sonríe la Roma, sonríe Scaloni.

I tried this first:

x = textwrap.TextWrapper(width=40,break_long_words=False,replace_whitespace=True)

conten = x.fill(string)

and then after aligning it and saving it to a txt file I did this, to try to place a new line after each dot:

with open('file.txt', 'r') as f:
    contents = f.read()

with open('file.txt', 'w') as f:
    f.write(contents.replace('. ', '.\n\n'))

But the result I get is something like this:

Qué momento en el Olímpico de Roma. 
Mou 
saca a Dybala para una 
merecida ovación de la hinchada, 
tras anotar doblete. 
Paulo le besa la mano mientras 
ambos sonríen. 
Si 
hay alguien que puede recuperar 
la mejor versión de la Joya, ese 
es Mou.
Sonríe 
la Roma, sonríe Scaloni.

What am I doing wrong?

CodePudding user response:

Supposing we have text like:

text = """Qué momento en el Olímpico de Roma. 
Mou saca a Dybala para una merecida ovación de la hinchada, tras anotar doblete. 
Paulo le besa la mano mientras ambos sonríen. 


Si hay alguien que puede recuperar la mejor versión de la Joya, ese es Mou. 
Sonríe la Roma, sonríe Scaloni."""

Instead of trying to fix the text after wrapping, let's split it into paragraphs, wrap each using a list comprehension, and then put newlines back when we join the paragraphs together:

paragraphs = text.split('\n\n')
wrapper = textwrap.TextWrapper(width=40,break_long_words=False,replace_whitespace=True)
wrapped = [wrapper.fill(paragraph.strip()) for paragraph in paragraphs]
result = '\n\n'.join(wrapped)

Let's see what we got:

>>> print(result)
Qué momento en el Olímpico de Roma.  Mou
saca a Dybala para una merecida ovación
de la hinchada, tras anotar doblete.
Paulo le besa la mano mientras ambos
sonríen.

Si hay alguien que puede recuperar la
mejor versión de la Joya, ese es Mou.
Sonríe la Roma, sonríe Scaloni.

If we instead split up individual lines, and join them as lines:

>>> lines = text.split('\n')
>>> wrapped = [wrapper.fill(line.strip()) for line in lines]
>>> print('\n'.join(wrapped))
Qué momento en el Olímpico de Roma.
Mou saca a Dybala para una merecida
ovación de la hinchada, tras anotar
doblete.
Paulo le besa la mano mientras ambos
sonríen.


Si hay alguien que puede recuperar la
mejor versión de la Joya, ese es Mou.
Sonríe la Roma, sonríe Scaloni.

CodePudding user response:

It looks like you want to preserve the line breaks in the original text, but when you use textwrap.fill, it collapses all the lines together.

You can preserve the original line breaks yourself by first using re.split to split the input by line breaks while also capturing them, so that you can then apply textwrap.fill to each individual paragraph and output the captured original line breaks separately:

import textwrap
import re

wrapper = textwrap.TextWrapper(
    width=40, break_long_words=False, replace_whitespace=True
)
with open('file.txt') as file:
    for paragraph in re.split(r'(\n )', file.read()):
        if not paragraph.isspace():
            paragraph = wrapper.fill(paragraph)
        print(paragraph, end='')

Given your input, this outputs:

Qué momento en el Olímpico de Roma.
Mou saca a Dybala para una merecida
ovación de la hinchada, tras anotar
doblete.
Paulo le besa la mano mientras ambos
sonríen.


Si hay alguien que puede recuperar la
mejor versión de la Joya, ese es Mou.
Sonríe la Roma, sonríe Scaloni.

Demo: https://replit.com/@blhsing/ForsakenDarlingApplications

CodePudding user response:

Looks like this library only deals with paragraphs at a time. So split text into paragraphs, wrap each one, then joint back together.

import textwrap

text = open('text.txt').read()
paragraphs = text.split('\n\n')
wrapped = [textwrap.fill(p) for p in paragraphs]
print('\n\n'.join(wrapped))
  • Related