Python textwrap Library - How to Preserve Line Bre

2019-03-15 13:18发布

When using Python's textwrap library, how can I turn this:

short line,

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

into this:

short line,

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx

I tried:

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

But I get:

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

(spacing not exact in my examples)

8条回答
beautiful°
2楼-- · 2019-03-15 13:39

How about wrap only lines longer then 90 characters?

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"
查看更多
何必那么认真
3楼-- · 2019-03-15 13:44

TextWrapper is not designed to handle text that already has newlines in it.

There are a two things you may want to do when your document already has newlines:

1) Keep old newlines, and only wrap lines that are longer than the limit.

You can subclass TextWrapper as follows:

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

Then use it the same way as textwrap:

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

Gives you:

short line,
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx

2) Remove the old newlines and wrap everything.

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

Gives you

short line,  long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

(TextWrapper doesn't do either of these - it just ignores the existing newlines, which leads to a weirdly formatted result)

查看更多
登录 后发表回答