2009-07-22 12 views
10

Podczas korzystania odpychania tekstu biblioteki Pythona, w jaki sposób można włączyć to:Python textwrap Library - jak zachować przerwy w linii?

short line, 

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

w tym:

short line, 

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxx 

Próbowałem:

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

Ale otrzymuję:

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

(rozstaw nie dokładny w moich przykładach)

Odpowiedz

13

spróbować

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

że wydawało się rozwiązać problem dla mnie

Pracowałem że się z tego co czytałem here (nigdy nie używałem odpychania tekstu przed)

+3

Pamiętaj, że w tym przypadku opakowanie traktuje \ n jako znak, a nie jako przerywacz linii, na przykład zakłada, że ​​poprzednio \ npublished jest jednym słowem. Powoduje to problemy z formatowaniem w wielu przypadkach. Zatem rozwiązanie z "\ n" .join(), podane przez użytkownika "daleko" jest lepsze. – Zulko

3

Co powiesz na zawijanie tylko linii dłuższych niż 90 znaków?

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

miałem podobny problem formatowania dynamicznie generowanych docstrings. Chciałem zachować nowe linie wprowadzone ręcznie i podzielić dowolne linie na pewnej długości. Po ponownym opracowaniu odpowiedzi przez @far rozwiązanie to sprawdziło się. Załączam go tylko dla potomności:

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 nie jest przeznaczony do obsługi tekstu, który zawiera już znaki nowej linii.

Istnieje dwie rzeczy, które warto zrobić, gdy dokument został już nowe linie:

1) Przechowywać stare znaki nowej linii, a jedynie zawijanie linii, które są dłuższe niż limit.

Można podklasy TextWrapper następująco:

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 

następnie używać go w taki sam sposób jak odpychania tekstu:

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

daje:

short line, 
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxx 

2) Usunąć stare znaki i wszystko zawijaj.

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

Daje

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

(TextWrapper nie robi żadnej z nich - po prostu ignoruje istniejące znaki nowej linii, co prowadzi do wyniku dziwnie sformatowany)

Powiązane problemy