python:textwrap 文本自动换行与填充

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

语法简介

textwrap模块提供的快捷函数如下:

wrap函数:

  • 对 text (字符串) 中的单独段落自动换行以使每行长度最多为 width 个字符。 返回由输出行组成的列表,行尾不带换行符。
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)

fill函数:

  • 对 text 中的单独段落自动换行,并返回一个包含被自动换行段落的单独字符串。
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)

shorten函数:

  • 折叠并截短给定的 text 以符合给定的 width。
textwrap.shorten(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)

dedent函数:

  • 移除 text 中每一行的任何相同前缀空白符。
textwrap.shorten(text)

indent函数:

  • 将 prefix 添加到 text 中选定行的开头。
  • 通过调用 text.splitlines(True) 来对行进行拆分。
  • 默认情况下,prefix 会被添加到所有不是只由空白符(包括任何行结束符)组成的行。
textwrap.indent(text, prefix, predicate=None)

参数说明:

  • width:(默认: 70) 自动换行的最大行长度。

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

  • tabsize:(默认: 8) 如果 expand_tabs 为真值,则 text 中所有的制表符将扩展为零个或多个空格,具体取决于当前列位置和给定的制表宽度。

  • replace_whitespace:(默认: True) 如果为真值,在制表符扩展之后、自动换行之前,wrap() 方法将把每个空白字符都替换为单个空格。 会被替换的空白字符如下:制表,换行,垂直制表和回车 ('\t\n\v\r')。

  • drop_whitespace:(默认: True) 如果为真值,每一行开头和末尾的空白字符(在包装之后、缩进之前)会被丢弃。 但是段落开头的空白字符如果后面不带任何非空白字符则不会被丢弃。 如果被丢弃的空白字符占据了一个整行,则该整行将被丢弃。

  • initial_indent:(默认: ' ') 将被添加到被自动换行输出内容的第一行的字符串。 其长度会被计入第一行的长度。 空字符串不会被缩进。

  • subsequent_indent:(默认: ' ') 将被添加到被自动换行输出内容除第一行外的所有行的字符串。 其长度会被计入除行一行外的所有行的长度。

  • fix_sentence_endings:(默认: False) 如果为真值,TextWrapper 将尝试检测句子结尾并确保句子间总是以恰好两个空格符分隔。 对于使用等宽字体的文本来说通常都需要这样。

  • break_long_words:(默认: True) 如果为真值,则长度超过 width 的单词将被分开以保证行的长度不会超过 width。 如果为假值,超长单词不会被分开,因而某些行的长度可能会超过 width。 (

  • break_on_hyphens:(默认: True) 如果为真值,将根据英语的惯例首选在空白符和复合词的连字符之后自动换行。 如果为假值,则只有空白符会被视为合适的潜在断行位置,但如果你确实不希望出现分开的单词则你必须将
    break_long_words 设为假值。

  • max_lines:(默认: None) 如果不为 None,则输出内容将最多包含 max_lines 行,并使 placeholder 出现在输出内容的末尾。

  • placeholder:(默认: ' […]') 该文本将在输出文本被截短时出现在文本末尾。

示例展示

wrap函数的示例如下:

import textwrap

str_data = """
  哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈       怀旧服         翻山倒海   不会发生代表/n会尽快发货时.?electroencephalography 
"""
print(str_data)
print(textwrap.wrap(str_data, width=5))
print(textwrap.wrap(str_data, initial_indent='&&'))
print(textwrap.wrap(str_data, subsequent_indent='10'))
print(textwrap.wrap(str_data, expand_tabs=False))
print(textwrap.wrap(str_data, tabsize=5))
print(textwrap.wrap(str_data, width=5, replace_whitespace=False))
print(textwrap.wrap(str_data, width=5, fix_sentence_endings=True))
print(textwrap.wrap(str_data, width=5, break_long_words=False))
print(textwrap.wrap(str_data, width=5, break_on_hyphens=True))
print(textwrap.wrap(str_data, width=5, drop_whitespace=True))
print(textwrap.wrap(str_data, width=5, max_lines=1, placeholder='》》》》》'))

运行结果

  哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       怀旧服         翻山倒海   不会发生代表/n会尽快发货时.?electroencephalography 

['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '怀旧服', '翻山倒海', '不会发生代', '表/n会尽', '快发货时.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['&&   哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       怀旧服         翻山倒海', '不会发生代表/n会尽快发货时.?electroencephalography']
['   哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       怀旧服         翻山倒海', '10不会发生代表/n会尽快发货时.?electroencephalography']
['   哈哈 哈啊哈哈 啊哈哈哈啊哈哈哈       怀旧服         翻山倒海', '不会发生代表/n会尽快发货时.?electroencephalography']
['   哈哈 哈啊哈哈 啊哈哈哈啊哈哈哈       怀旧服         翻山倒海', '不会发生代表/n会尽快发货时.?electroencephalography']
['\n  哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '怀旧服', '翻山倒海', '不会发生代', '表/n会尽', '快发货时.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '怀旧服', '翻山倒海', '不会发生代', '表/n会尽', '快发货时.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊哈哈哈', '怀旧服', '翻山倒海', '不会发生代表/n会尽快发货时.?electroencephalography']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '怀旧服', '翻山倒海', '不会发生代', '表/n会尽', '快发货时.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '怀旧服', '翻山倒海', '不会发生代', '表/n会尽', '快发货时.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['》》》》》']

Process finished with exit code 0

fill函数的示例如下:

  • fill函数和wrap函数都是共用TextWrapper类实现的,两个函数唯一的区别就是,wrap函数返回的是列表类型,fill函数返回的是字符串类型

shorten函数的示例如下:

  • shorten函数和fill函数、wrap函数的区别就是它的width参数是必传的,最后返回的都是折叠的数据
import textwrap

str_data = """
  哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈       怀旧服         翻山倒海   不会发生代表/n会尽快发货时.?electroencephalography 
"""
print(str_data)
print(textwrap.shorten(str_data, width=5))
print(textwrap.shorten(str_data, width=10, initial_indent='&&'))
print(textwrap.shorten(str_data, width=5, subsequent_indent='10'))
print(textwrap.shorten(str_data, width=5, expand_tabs=False))
print(textwrap.shorten(str_data, width=5, tabsize=5))
print(textwrap.shorten(str_data, width=5, replace_whitespace=False))
print(textwrap.shorten(str_data, width=5, fix_sentence_endings=True))
print(textwrap.shorten(str_data, width=5, break_long_words=False))
print(textwrap.shorten(str_data, width=5, break_on_hyphens=True))
print(textwrap.shorten(str_data, width=5, drop_whitespace=True))
print(textwrap.shorten(str_data, width=5, placeholder='...'))

运行结果

  哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       怀旧服         翻山倒海   不会发生代表/n会尽快发货时.?electroencephalography 

[...]
&&哈哈 [...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
哈哈...

Process finished with exit code 0

dedent函数的示例如下:

  • 移除 text 中每一行的任何相同前缀空白符
import textwrap

str_data = """
  哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈       怀旧服         翻山倒海   不会发生代表/n会尽快发货时.?electroencephalography 
"""
print(str_data)
print(textwrap.dedent(str_data))

运行结果

  哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       怀旧服         翻山倒海   不会发生代表/n会尽快发货时.?electroencephalography 


哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       怀旧服         翻山倒海   不会发生代表/n会尽快发货时.?electroencephalography 

dedent函数的示例如下:

  • 将 prefix 添加到 text 中选定行的开头
import textwrap

str_data = """
/n/n哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈怀旧服翻山倒海不会发生代表/n会尽快发货时.?electroencephalography 
"""
print(str_data)
print(textwrap.indent(str_data, prefix='    '))

运行结果

/n/n哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈怀旧服翻山倒海不会发生代表/n会尽快发货时.?electroencephalography 


    /n/n哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈怀旧服翻山倒海不会发生代表/n会尽快发货时.?electroencephalography 


Process finished with exit code 0
  • 可选的 predicate 参数可用来控制哪些行要缩进。 例如,可以很容易地为空行或只有空白符的行添加 prefix:
import textwrap

str_data = """
哈哈哈啊\n哈哈啊哈哈哈\n啊哈哈哈怀旧服\n翻山\n倒海不会发生代表\n会尽快发货时.?electroencephalography 
"""
print(str_data)
print("_" * 50)
print(textwrap.indent(str_data, ' +'))
print("_" * 50)
print(textwrap.indent(str_data, ' +', lambda line: True))

运行结果

哈哈哈啊
哈哈啊哈哈哈
啊哈哈哈怀旧服
翻山
倒海不会发生代表
会尽快发货时.?electroencephalography 

__________________________________________________

 +哈哈哈啊
 +哈哈啊哈哈哈
 +啊哈哈哈怀旧服
 +翻山
 +倒海不会发生代表
 +会尽快发货时.?electroencephalography 

__________________________________________________
 +
 +哈哈哈啊
 +哈哈啊哈哈哈
 +啊哈哈哈怀旧服
 +翻山
 +倒海不会发生代表
 +会尽快发货时.?electroencephalography 


Process finished with exit code 0

以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的点赞和分享哟,谢谢!

未完,待续…

一直都在努力,希望您也是!

微信搜索公众号:就用python

文章作者:李 锋|编辑排版:梁莉莉

 

原文地址:https://www.cnblogs.com/lifeng0402/p/15689667.html