2009-07-22 4 views
10

Quando si utilizza biblioteca textwrap di Python, come posso trasformare questo:Libreria textwrap Python - Come preservare le interruzioni di riga?

short line, 

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

in questo:

short line, 

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxx 

ho provato:

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

ma ottengo:

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

(spaziatura non precisa nei miei esempi)

risposta

13

provare

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

che sembrava risolvere il problema per me

ho lavorato che fuori da quello che ho letto here (non ho mai usato prima textwrap)

+3

Attenzione che in questo caso il wrapper considera \ n come carattere e non come interrutore di riga, ad esempio assumerà che in precedenza \ npublished sia una parola. Ciò causa problemi di formattazione in molti casi. Quindi la soluzione con "\ n" .join(), data dall'utente "lontano" è migliore. – Zulko

3

Come circa avvolgere solo le righe più lunghe di 90 caratteri?

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" 
0
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) 
8
body = '\n'.join(['\n'.join(textwrap.wrap(line, 90, 
       break_long_words=False, replace_whitespace=False)) 
       for line in body.splitlines() if line.strip() != '']) 
0

ho avuto un problema simile formattazione docstring generati in modo dinamico. Volevo preservare le newline messe in atto a mano e dividere qualsiasi riga su una certa lunghezza. Risolvendo la risposta di @far un po ', questa soluzione ha funzionato per me. Lo includo solo per i posteri:

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()]) 
0

TextWrapper non è progettato per gestire il testo che contiene già nuove righe.

Ci sono due cose che si può fare quando il documento è già a capo:

1) mantenere la vecchia a capo, e avvolgere solo linee che sono più lungo del limite.

È possibile creare una sottoclasse TextWrapper come segue:

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 

quindi utilizzarlo allo stesso modo di textwrap:

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

Ti dà:

short line, 
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxx 

2) Rimuovere la vecchie novità e avvolgono tutto.

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

Ti dà

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

(TextWrapper non fa uno di questi - semplicemente ignora le nuove linee esistenti, che porta ad un risultato stranamente formattato)