textwrap — 文本换行和填充

源代码: Lib/textwrap.py


textwrap 模块提供了一些便捷函数,以及 TextWrapper 类,它完成了所有工作。如果你只是要对一两个文本字符串进行换行或填充,那么便捷函数就足够了;否则,为了提高效率,你应该使用 TextWrapper 的实例。

textwrap.wrap(text, width=70, *, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')

text(字符串)中的单个段落进行换行,使每行最多不超过 width 个字符。返回一个输出行列表,不带最后的换行符。

可选的关键字参数对应于 TextWrapper 的实例属性,如下所述。

有关 wrap() 行为的更多详细信息,请参阅 TextWrapper.wrap() 方法。

textwrap.fill(text, width=70, *, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')

text 中的单个段落进行换行,并返回一个包含已换行段落的字符串。 fill() 是以下代码的简写形式

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

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

textwrap.shorten(text, width, *, fix_sentence_endings=False, break_long_words=True, break_on_hyphens=True, placeholder=' [...]')

折叠并截断给定的 text 以适应给定的 width

首先,text 中的空格会被折叠(所有空格都被替换为单个空格)。如果结果符合 width,则返回结果。否则,将从末尾删除足够的单词,以便剩余的单词加上 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 的实例属性,如下所述。请注意,空格在传递给 TextWrapperfill() 函数之前会被折叠,因此更改 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)

prefix 添加到 text 中所选行的开头。

通过调用 text.splitlines(True) 来分隔行。

默认情况下,prefix 会添加到所有不完全由空白符(包括任何行尾符)组成的行中。

例如

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

可选的 predicate 参数可用于控制缩进哪些行。例如,可以轻松地将 prefix 添加到空行和仅包含空白符的行中

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

3.3 版新增。

wrap()fill()shorten() 的工作方式是创建一个 TextWrapper 实例并调用其上的单个方法。该实例不会被重复使用,因此对于使用 wrap() 和/或 fill() 处理许多文本字符串的应用程序,创建您自己的 TextWrapper 对象可能会更有效率。

文本最好在空白符和带连字符的单词中的连字符后换行;只有这样,如果需要,才会断开长单词,除非 TextWrapper.break_long_words 设置为 false。

class textwrap.TextWrapper(**kwargs)

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

wrapper = TextWrapper(initial_indent="* ")

与以下代码相同

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

您可以多次重复使用同一个 TextWrapper 对象,并且您可以在每次使用之间通过直接赋值给实例属性来更改其任何选项。

TextWrapper 实例属性(以及构造函数的关键字参数)如下所示

width

(默认值:70)换行后的最大行长度。只要输入文本中没有单个单词的长度超过 widthTextWrapper 就可以保证任何输出行的长度都不会超过 width 个字符。

expand_tabs

(默认值:True)如果为 true,则 text 中的所有制表符都将使用 textexpandtabs() 方法扩展为空格。

tabsize

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

3.3 版新增。

replace_whitespace

(默认值:True)如果为 true,则在制表符扩展之后但在换行之前,wrap() 方法会将每个空白符替换为单个空格。被替换的空白符如下:制表符、换行符、垂直制表符、换页符和回车符 ('\t\n\v\f\r')。

注意

如果 expand_tabs 为 false 且 replace_whitespace 为 true,则每个制表符都将被替换为单个空格,这与制表符扩展不同

注意

如果 replace_whitespace 为 false,则换行符可能会出现在行的中间并导致奇怪的输出。因此,应将文本拆分为段落(使用 str.splitlines() 或类似方法),并分别进行换行。

drop_whitespace

(默认值:True)如果为 true,则会删除每行开头和结尾的空白符(换行后但在缩进之前)。但是,如果段落开头的空白符后跟非空白符,则不会删除该空白符。如果删除的空白符占据了整行,则会删除整行。

initial_indent

(默认值:'')将添加到换行输出的第一行开头的字符串。计入第一行的长度。空字符串不缩进。

subsequent_indent

(默认值:'')将添加到除第一行之外的所有换行输出行开头的字符串。计入除第一行之外的每一行的长度。

fix_sentence_endings

(默认值:False)如果为 true,TextWrapper 会尝试检测句子结尾,并确保句子之间始终只隔两个空格。这通常是等宽字体文本所期望的。但是,句子检测算法并不完美:它假设句子结尾由一个小写字母组成,后跟 '.''!''?'span> 中的一个,可能后跟 '"'"'" 中的一个,再后跟一个空格。这个算法的一个问题是,它无法检测“Dr.” in

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

和“Spot.” in

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

fix_sentence_endings 默认值为 false。

由于句子检测算法依赖于 string.lowercase 来定义“小写字母”,并且约定在句点后使用两个空格来分隔同一行上的句子,因此它特定于英语文本。

break_long_words

(默认值:True)如果为 true,则长度超过 width 的单词将被断开,以确保任何行的长度都不超过 width。如果为 false,则长单词不会被断开,并且某些行的长度可能会超过 width。(长单词将单独放在一行上,以最大程度地减少超过 width 的量。)

break_on_hyphens

(默认值:True)如果为 true,则换行将优先在空格处和复合词中的连字符后进行,这在英语中很常见。如果为 false,则只有空格才会被视为潜在的良好换行位置,但如果您希望单词真正不可分割,则需要将 break_long_words 设置为 false。先前版本中的默认行为是始终允许断开带连字符的单词。

max_lines

(默认值:None)如果不是 None,则输出将最多包含 max_lines 行,并在输出的末尾显示 placeholder

3.4 版新增。

placeholder

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

3.4 版新增。

TextWrapper 还提供了一些公共方法,类似于模块级便捷函数

wrap(text)

text(字符串)中的单个段落进行换行,以便每行的长度最多为 width 个字符。所有换行选项均取自 TextWrapper 实例的实例属性。返回一个输出行列表,不带最后的换行符。如果换行后的输出没有内容,则返回的列表为空。

fill(text)

text 中的单个段落进行换行,并返回包含换行后的段落的单个字符串。