在 Python 编程中,处理文本是一项常见任务,比如自动换行、填充文本、缩短文本等。textwrap
模块就像是一个贴心助手,专门用来解决这些问题。本文将带你深入了解textwrap
模块的各种功能,通过丰富的示例代码和清晰的讲解,让你轻松掌握它的使用技巧,提升文本处理能力。
textwrap
模块概述textwrap
模块是 Python 标准库的一部分,位于Lib/textwrap.py
。它提供了快捷函数和TextWrapper
类,帮助我们对文本进行自动换行、填充、缩短、去除缩进和添加缩进等操作。如果只是偶尔处理一两个文本字符串,使用快捷函数就足够了;要是需要频繁处理大量文本,为了提高效率,建议使用TextWrapper
类的实例。
wrap
函数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
个字符,返回由换行后的行组成的列表,行尾没有换行符。
比如,我们有一段很长的文本,想要把它每行限制在 20 个字符内:
import textwrap
text = "这是一段非常长的文本,用于测试textwrap.wrap函数的换行功能。"
wrapped_text = textwrap.wrap(text, width=20)
for line in wrapped_text:
print(line)
输出结果:
这是一段非常长的文本,
用于测试textwrap.wrap
函数的换行功能。
各参数含义:
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
:当输出被截断时,在末尾添加的占位符,默认' [...]'
。fill
函数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=' [...]')
fill
函数也是对文本进行自动换行,不过它返回的是一个包含换行后段落的字符串,其实它就是"\n".join(wrap(text, ...))
的快捷方式,接受的参数和wrap
函数完全一样。
text = "这是一段非常长的文本,用于测试textwrap.fill函数的换行功能。"
filled_text = textwrap.fill(text, width=20)
print(filled_text)
输出结果:
这是一段非常长的文本,
用于测试textwrap.fill
函数的换行功能。
shorten
函数textwrap.shorten(text, width, *, fix_sentence_endings=False, break_long_words=True, break_on_hyphens=True, placeholder=' [...]')
该函数用于折叠并截短文本,使其符合指定的width
。首先会折叠文本中的空格,如果折叠后的文本能适应width
,就直接返回;否则,会丢弃末尾的单词,直到剩余内容加上placeholder
能适应width
。
print(textwrap.shorten("Hello world!", width=12))
print(textwrap.shorten("Hello world!", width=11))
print(textwrap.shorten("Hello world", width=10, placeholder="..."))
输出结果:
Hello world!
Hello [...]
Hello...
需要注意的是,在传入TextWrapper
的fill()
函数之前,文本会被折叠,所以修改tabsize
、expand_tabs
、drop_whitespace
和replace_whitespace
的值对shorten
函数没有效果。
dedent
函数textwrap.dedent(text)
这个函数用于移除文本中每一行相同的前缀空白符,常用来清除三重引号字符串左侧的空格,同时只包含空白符的行会被忽略,输出时会标准化为单个换行符。
def test():
s = '''
hello
world
'''
print(repr(s))
print(repr(textwrap.dedent(s)))
test()
输出结果:
'\n hello\n world\n '
'hello\n world\n'
indent
函数textwrap.indent(text, prefix, predicate=None)
该函数用于给文本中选定的行添加前缀prefix
。默认情况下,会给非空行(不只是空白符的行)添加前缀。也可以通过predicate
参数来控制哪些行添加前缀。
s = 'hello \n\n\n world'
print(textwrap.indent(s, ' '))
print(textwrap.indent(s, '+ ', lambda line: True))
输出结果:
hello
world
+ hello
+
+
+ world
TextWrapper
类详解TextWrapper
构造器接受多个可选的关键字参数,每个参数对应一个实例属性。例如:
wrapper = TextWrapper(initial_indent="* ")
等同于:
wrapper = TextWrapper()
wrapper.initial_indent = "* "
实例属性如下:
属性名 | 默认值 | 说明 |
---|---|---|
width |
70 |
自动换行的最大行长度 |
expand_tabs |
True |
是否扩展制表符为空格 |
tabsize |
8 |
制表符扩展的空格数(expand_tabs 为True 时有效) |
replace_whitespace |
True |
是否把空白字符替换为单个空格 |
drop_whitespace |
True |
是否去除每行开头和结尾的空白字符 |
initial_indent |
'' |
第一行的缩进字符串 |
subsequent_indent |
'' |
除第一行外其他行的缩进字符串 |
fix_sentence_endings |
False |
是否修正句子结尾的空格(仅适用于英语文本) |
break_long_words |
True |
是否拆分长单词 |
break_on_hyphens |
True |
是否在连字符后换行 |
max_lines |
None |
限制输出的最大行数 |
placeholder |
' [...]' |
输出被截断时的占位符 |
wrap(text)
:对text
进行自动换行,返回由换行后的行组成的列表,行尾无换行符,换行选项从实例属性获取。
fill(text)
:对text
进行自动换行,返回包含换行后段落的字符串。
wrapper = TextWrapper(width=20, initial_indent='- ', subsequent_indent=' ')
text = "这是一段用于测试TextWrapper类的文本。"
wrapped = wrapper.wrap(text)
for line in wrapped:
print(line)
filled = wrapper.fill(text)
print(filled)
输出结果:
- 这是一段用于测试
TextWrapper类的文本。
- 这是一段用于测试
TextWrapper类的文本。
textwrap
模块在处理英语文本时,fix_sentence_endings
功能能较好地修正句子结尾空格。但对于其他语言,比如中文,该功能就不太适用了。在处理中文文本时,我们更关注的可能是按字数换行,并且中文句子结尾的标点符号和英文不同。此时,虽然textwrap
模块的基本换行功能依然可用,但一些依赖英文规则的参数就需要我们自己根据中文特点进行调整。例如,中文中没有连字符单词的概念,break_on_hyphens
参数对中文文本处理没有实际意义。
在实际项目中,textwrap
模块常常和其他文本处理库一起使用。比如re
模块(正则表达式库),当我们需要对文本进行更复杂的预处理,比如提取特定格式的内容、替换特定模式的字符串等,就可以先用re
模块处理,再用textwrap
模块进行换行、填充等操作。又比如nltk
(自然语言处理工具包),在处理自然语言文本时,nltk
可以进行词性标注、句子分割等更深入的分析,然后再借助textwrap
模块对处理后的文本进行格式化输出。
textwrap
模块为 Python 开发者提供了强大且方便的文本处理功能,无论是简单的文本换行,还是复杂的文本格式化,它都能应对。通过快捷函数和TextWrapper
类,我们可以灵活地控制文本的排版样式。在使用过程中,要根据具体需求合理设置参数,同时注意不同参数之间的相互影响。对于处理不同语言文本和复杂文本处理场景,可以结合其他相关库来实现更完善的功能。
textwrap
模块的详细说明,包含函数和类的定义、参数介绍、使用示例等,是最权威的学习资料。textwrap
模块的使用,同时结合实际案例讲解,帮助读者更好地理解和应用。