Python textwrap库 - 如何保留换行符?

Gre*_*reg 15 python newline word-wrap

使用Python的textwrap库时,我该怎么做呢:

short line,

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

进入这个:

short line,

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

我试过了:

w = textwrap.TextWrapper(width=90,break_long_words=False)
body = '\n'.join(w.wrap(body))
Run Code Online (Sandbox Code Playgroud)

但我得到:

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

(我的例子中的间距不完全)

Pet*_*ter 17

尝试

w = textwrap.TextWrapper(width=90,break_long_words=False,replace_whitespace=False)
Run Code Online (Sandbox Code Playgroud)

这似乎解决了我的问题

我从我在这里阅读的内容中解决了这个问题(我之前从未使用过textwrap)

  • 请注意,在这种情况下,包装器将\n视为字符而不是线路断路器,例如,它将假设先前\npublished是一个字.这在许多情况下会导致格式化问题.因此,用户"far"给出的"\n".join()解决方案更好. (3认同)

小智 11

body = '\n'.join(['\n'.join(textwrap.wrap(line, 90,
                 break_long_words=False, replace_whitespace=False))
                 for line in body.splitlines() if line.strip() != ''])
Run Code Online (Sandbox Code Playgroud)


tef*_*ozi 6

仅对长度超过 90 个字符的行进行换行怎么样?

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"
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 6

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
Run Code Online (Sandbox Code Playgroud)

然后以与 textwrap 相同的方式使用它:

d = DocumentWrapper(width=90)
wrapped_str = d.fill(original_str)
Run Code Online (Sandbox Code Playgroud)

给你:

short line,
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

2)删除旧的换行符并包装所有内容。

original_str.replace('\n', '')
wrapped_str = textwrap.fill(original_str, width=90)
Run Code Online (Sandbox Code Playgroud)

给你

short line,  long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

(TextWrapper 不会执行这些操作 - 它只是忽略现有的换行符,这会导致格式奇怪的结果)