如何在`textwrap.fill`中保留双重换行符?

时间:2014-07-07 17:05:06

标签: python textwrapping

我有一个由几个段落组成的文本,这些段落被双重换行符分隔。我想将它们格式化为70的线宽,保持新的线条和整个事物应该从一条带有Abstract: Lorem ipsum ...的非缩进线开始。

所以整件事应该是这样的:

Abstract: Magna risus nonummy mollis mattis neque commodo mattis fusce  
          hendrerit nibh. Lorem massa lorem mauris ad orci quam risus
          viverra aliquet senectus sociis. Donec proin nam dolor neque
          placerat imperdiet eros ullamcorper egestas cum torquent
          habitasse. Risus donec odio nostra ac et pede inceptos
          praesent montes. Neque morbi sit morbi vestibulum
          suspendisse mauris. Lacus massa mollis.

          Donec class integer pede ac sed elit. Fames augue magnis
          sapien natoque nisi. Proin augue mus nisl interdum convallis
          pellentesque conubia.

          Class dolor tempor netus suspendisse odio orci
          vestibulum mus. Netus purus. Lacus metus tempor purus
          adipiscing faucibus eget maecenas. Velit lacus integer
          rhoncus primis nunc quis lorem lacus dictumst hendrerit.

我正在尝试使用textwrap,但这不会产生所需的输出。这是代码:

from loremipsum import get_paragraphs
import textwrap

text = '\n\n'.join(get_paragraphs(3))
item = 'Abstract: '

print textwrap.fill(item+text,initial_indent='',subsequent_indent=' '*len(item),replace_whitespace=False)

这适用于第一段,但以下段落得到一些奇怪的缩进和这样的短行

Class vitae
          nonummy imperdiet cras blandit fusce. Massa porta metus
          semper tempor non id viverra eget. Purus morbi lorem semper
          eget. Proin magna tortor metus magnis. Vitae ipsum. Velit
          class aliquet tortor dolor parturient ullamcorper libero ac.

即使我使用initial_indent=' '*len(item),也会发生这种情况。这是一个错误吗?我怎样才能得到我想要的东西?

1 个答案:

答案 0 :(得分:3)

来自文档:

  

注意:如果replace_whitespace为false,则换行符可能出现在行的中间并导致奇怪的输出。因此,文本应分为段落(使用str.splitlines()或类似),这些段落将单独包装。

所以你应该这样做:

paragraphs = get_paragraphs(3)
item = 'Abstract: '
paragraphs[0] = item + paragraphs[0]
for idx, paragraph in enumerate(paragraphs):
    rest_indent = " "*len(item)
    start_indent = "" if idx == 0 else rest_indent
    print textwrap.fill(paragraph,initial_indent=start_indent,subsequent_indent=rest_indent,replace_whitespace=False)
    print ""

或者,使用列表理解:

paragraphs = get_paragraphs(3)
item = 'Abstract: '
text = "\n\n".join(textwrap.fill(p,initial_indent=' '*len(item),subsequent_indent=' '*len(item)) for p in paragraphs)
print item + text.lstrip()