textwrap ---文字环绕和填充

源代码: Lib/textwrap.py


这个 textwrap 模块提供了一些方便的功能,以及 TextWrapper 完成所有工作的类。如果只是封装或填充一个或两个文本字符串,那么便利函数应该足够好;否则,应该使用 TextWrapper 为了效率。

textwrap.wrap(text, width=70, **kwargs)

将单个段落封装在 text (一根绳子)所以每一行至多是 宽度 字符长。返回输出行的列表,不带最后的换行符。

可选关键字参数对应的实例属性 TextWrapper ,记录如下。 宽度 默认为 70 .

TextWrapper.wrap() 有关如何 wrap() 表现。

textwrap.fill(text, width=70, **kwargs)

将单个段落封装在 text ,并返回包含已换行段落的单个字符串。 fill() 缩写为:

"\n".join(wrap(text, ...))

特别地, fill() 接受与完全相同的关键字参数 wrap() .

textwrap.shorten(text, width, **kwargs)

折叠并截断给定的 text 符合给定的 宽度 .

首先是空白 text 折叠(所有空格都替换为单个空格)。如果结果符合 宽度 ,则返回。否则,将从结尾处删除足够的单词,以便剩余的单词加上 placeholder 适合于 width ::

>>> textwrap.shorten("Hello  world!", width=12)
'Hello world!'
>>> textwrap.shorten("Hello  world!", width=11)
'Hello [...]'
>>> textwrap.shorten("Hello world", width=10, placeholder="...")
'Hello...'

可选关键字参数对应的实例属性 TextWrapper ,记录如下。请注意,在将文本传递到 TextWrapper fill() 函数,因此更改 tabsizeexpand_tabsdrop_whitespacereplace_whitespace 不会有任何效果。

3.4 新版功能.

textwrap.dedent(text)

从中的每一行中删除所有常见的前导空格 text .

这可以用来使三个带引号的字符串与显示的左边缘对齐,同时仍然以缩进的形式在源代码中显示它们。

注意,制表符和空格都被视为空白,但它们并不相等:行 "  hello""\thello" 被认为没有常见的前导空格。

只包含空白的行在输入中被忽略,并在输出中规范化为单个换行符。

例如::

def test():
    # end first line with \ to avoid the empty line!
    s = '''\
    hello
      world
    '''
    print(repr(s))          # prints '    hello\n      world\n    '
    print(repr(dedent(s)))  # prints 'hello\n  world\n'
textwrap.indent(text, prefix, predicate=None)

添加 前缀 到中所选行的开头 text .

调用线是通过调用分隔的 text.splitlines(True) .

默认情况下, 前缀 添加到不单独包含空格的所有行(包括任何行尾)。

例如::

>>> s = 'hello\n\n \nworld'
>>> indent(s, '  ')
'  hello\n\n \n  world'

可选的 谓语 参数可用于控制缩进的行。例如,很容易添加 前缀 即使是空行和空白行:

>>> print(indent(s, '+ ', lambda line: True))
+ hello
+
+
+ world

3.3 新版功能.

wrap()fill()shorten() 通过创建 TextWrapper 实例并对其调用单个方法。该实例不会被重用,因此对于使用 wrap() 和/或 fill() ,创建自己的 TextWrapper 对象。

文本最好用空格封装,并在连字符后面加上连字符;只有这样,长单词才会在必要时被打断,除非 TextWrapper.break_long_words 设置为假。

class textwrap.TextWrapper(**kwargs)

这个 TextWrapper 构造函数接受许多可选关键字参数。每个关键字参数对应一个实例属性,例如:

wrapper = TextWrapper(initial_indent="* ")

与以下内容相同:

wrapper = TextWrapper()
wrapper.initial_indent = "* "

你可以重复使用 TextWrapper 对象很多次,您可以通过在使用之间直接分配实例属性来更改它的任何选项。

这个 TextWrapper 实例属性(和构造函数的关键字参数)如下:

width

(默认: 70 )换行的最大长度。只要输入文本中没有超过 widthTextWrapper 保证输出线长度不超过 width 字符。

expand_tabs

(默认: True )如果为真,则所有制表符 text 将使用扩展到空格 expandtabs() 方法 text .

tabsize

(默认: 8 如果 expand_tabs 为真,则所有制表符 text 将根据当前列和给定的制表符大小扩展为零个或多个空格。

3.3 新版功能.

replace_whitespace

(默认: True )如果为真,则在展开制表符后封装之前, wrap() 方法将用单个空格替换每个空白字符。替换的空白字符如下:制表符、换行符、竖排制表符、换行符和回车符 ('\t\n\v\f\r'

注解

如果 expand_tabs 是假的 replace_whitespace 为真,每个制表符将替换为一个空格,即 not 与选项卡扩展相同。

注解

如果 replace_whitespace 如果为假,换行符可能出现在行的中间并导致奇怪的输出。因此,文本应拆分为段落(使用 str.splitlines() 或类似)分开封装。

drop_whitespace

(默认: True )如果为真,则将删除每行开头和结尾的空白(换行后缩进前)。但是,如果后面跟着非空白,则不会删除段落开头的空白。如果删除的空白占用了整行,则会删除整行。

initial_indent

(默认: '' )将被封装输出的第一行前面的字符串。向第一行的长度计数。空字符串不缩进。

subsequent_indent

(默认: '' )将被封装输出的所有行(第一行除外)前面的字符串。对每行的长度计数,第一行除外。

fix_sentence_endings

(默认: False 如果是真的, TextWrapper 尝试检测句尾,并确保句子始终由两个空格分隔。这通常适用于单间距字体的文本。然而,句子检测算法是不完善的:它假设一个句子的结尾由一个小写字母和一个 '.''!''?' ,后面可能是 '"'"'" ,后跟一个空格。此算法的一个问题是,它无法检测“dr.”在中的差异:

[...] Dr. Frankenstein's monster [...]

和“斑点”在:

[...] See Spot. See Spot run [...]

fix_sentence_endings 默认为false。

因为句子检测算法依赖于 string.lowercase 对于“小写字母”的定义,以及在一个句点后使用两个空格分隔同一行上的句子的惯例,它是英语文本特有的。

break_long_words

(默认: True )如果是真的话,那么文字要比 width 将被断开,以确保任何行的长度都不超过 width . 如果是错的话,长句就不会被打断,有些句子可能比 width . (长单词将自己放在一行上,以便最小化 width 超过。

break_on_hyphens

(默认: True )如果为真,封装最好出现在复合词的空白处和连字符后,这在英语中很常见。如果为false,则只有空格将被视为换行的潜在好位置,但您需要设置 break_long_words 如果你真的想要插入的话就错了。在以前的版本中,默认行为是始终允许断字。

max_lines

(默认: None 如果没有 None ,则输出最多包含 max_lines 线,与 占位符 出现在输出的末尾。

3.4 新版功能.

placeholder

(默认: ' [...]' )如果输出文本已被截断,则将显示在该文本末尾的字符串。

3.4 新版功能.

TextWrapper 还提供了一些公共方法,类似于模块级的便利功能:

wrap(text)

将单个段落封装在 text (一根绳子)所以每一行至多是 width 字符长。所有封装选项都取自 TextWrapper 实例。返回输出行的列表,不带最后的换行符。如果封装输出没有内容,则返回的列表为空。

fill(text)

将单个段落封装在 text ,并返回包含已换行段落的单个字符串。