Table Of Contents

Previous topic

PyMOTW: StringIO and cStringIO

Next topic

PyMOTW: linecache

This Page

PyMOTW: textwrap

  • 模块:textwrap
  • 目的: 通过调整段落中的换行符位置来格式化文本
  • python版本:2.5

描述

textwrap模块可以用来格式化文本, 使其在某些场合输出更美观. 他提供了一些类似于在很多文本编辑器中都有的段落包装或填充特性的程序功能.

例子

import textwrap

# Provide some sample text
sample_text = '''

 The textwrap module can be used to format text for output in situations
 where pretty-printing is desired.  It offers programmatic functionality similar
 to the paragraph wrapping or filling features found in many text editors.

'''

fill()将文本作为输入, 格式化文本作为输出. 让我们看下面是如何对样本文本进行格式化的.

print 'No dedent:\n'
print textwrap.fill(sample_text)

结果比我们想要的结果要少:

No dedent:

        The textwrap module can be used to format text for output in
        situations         where pretty-printing is desired.  It offers
        programmatic functionality similar         to the paragraph wrapping
        or filling features found in many text editors.

Note

注意嵌入的tab符号和多余的空格被混合在输出文本中。这个看起来是很粗糙的。当然,我们可以做的更好。我们想在样本文本中的每一行的开始处删掉所有普通空格前缀。这个允许我们在去除代码本身的格式化时直接从Python代码中使用文档字符串或者嵌入式多行字符串。下面的样本字符串引入了一个人工的缩进层次以便更好的说明这个特征。

删除样本行中的普通空格前缀.

dedented_text = textwrap.dedent(sample_text).strip()
print 'Dedented:\n'
print dedented_text

结果看上去似乎好点:

Dedented:

The textwrap module can be used to format text for output in situations
where pretty-printing is desired.  It offers programmatic functionality similar
to the paragraph wrapping or filling features found in many text editors.

由于”dedent”是”indent”的相反, 结果就是将每行开始的普通空白符删除了. 如果某行已经比另一行多了个缩进层次, 那么对应的空格不会被去掉.

>>> a="""
...     one tab
...             two tab
...     one tab
... """
>>> import textwrap
>>> dedented_text = textwrap.dedent(a).strip()
>>> print dedented_text
one tab
    two tab
one tab
>>> print a
    one tab
        two tab
    one tab
>>>

接下来, 让我们看下如果我们传递非缩进格式的文本给fill(), 并使用一些不同的宽度值, 会发生什么.

使用不同行宽值进行格式化输出:

# Format the output with a few different max line width values
for width in [ 20, 60, 80 ]:
    print
    print '%d Columns:\n' % width
    print textwrap.fill(dedented_text, width=width)

在指定不同宽度时会有以下不同的输出结果:

20 Columns:

The textwrap module
can be used to
format text for
output in situations
where pretty-
printing is desired.
It offers
programmatic
functionality
similar to the
paragraph wrapping
or filling features
found in many text
editors.

60 Columns:

The textwrap module can be used to format text for output in
situations where pretty-printing is desired.  It offers
programmatic functionality similar to the paragraph wrapping
or filling features found in many text editors.

80 Columns:

The textwrap module can be used to format text for output in situations where
pretty-printing is desired.  It offers programmatic functionality similar to the
paragraph wrapping or filling features found in many text editors.

除了制定输出中的宽度, 你可以控制首行缩进, 他独立于接下来的行.

# Demonstrate how to produce a hanging indent
print '\nHanging indent:\n'
print textwrap.fill(dedented_text, initial_indent='', subsequent_indent='    ')

这个看起来很容易就能实现文本的悬挂缩进, 也就是首行要比后继行有少的缩进.

Hanging indent:

The textwrap module can be used to format text for output in
   situations where pretty-printing is desired.  It offers
   programmatic functionality similar to the paragraph wrapping or
   filling features found in many text editors.

缩进值也可以是非空格字符, 因此, 可以用*作为前缀产生bullet点, 等等. 在我转换老的zwiki内容以便将其导入到trac中是很灵活的. 我使用Zope中的StructuredText包来解析zwiki数据, 然后创建一个格式化器产生一个trac的wiki标记作为输出. 使用textwrap就可以格式化输出页, 因此转换后就几乎不需要再进行手工操作整个转换过程几乎没有手工进行.