用textwrap在Python中包装、截断和格式化字符串

商业

要在Python中通过包装(断行)和截断(缩写)一个任意数目的字符来格式化一个字符串,可以使用标准库的textwrap模块。

这里提供了以下信息。

  • 包裹一个字符串(换行): wrap(),fill()
  • 截断字符串(省略)。: shorten()
  • TextWrapper对象

如果你想把长字符串写在代码中的多行上,而不是写在输出中,请看下面的文章。

包裹一个字符串(换行): wrap(), fill()

通过textwrap模块的wrap()函数,你可以得到一个被断字分割的列表,以适应任意数量的字符。

指定第二个参数宽度的字符数。默认是width=70。

import textwrap

s = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages"

s_wrap_list = textwrap.wrap(s, 40)
print(s_wrap_list)
# ['Python can be easy to pick up whether', "you're a first time programmer or you're", 'experienced with other languages']

使用获得的列表,你可以通过以下方式获得一个被换行代码打断的字符串
'\n'.join(list)

print('\n'.join(s_wrap_list))
# Python can be easy to pick up whether
# you're a first time programmer or you're
# experienced with other languages

函数 fill() 返回一个换行字符串,而不是一个列表。这与在上面的例子中,在wrap()之后执行以下代码是一样的。
'\n'.join(list)

当你不需要一个列表,但想向终端输出一个固定宽度的字符串时,这样做比较方便,等等。

print(textwrap.fill(s, 40))
# Python can be easy to pick up whether
# you're a first time programmer or you're
# experienced with other languages

如果指定参数max_line,后面的行数将被省略。

print(textwrap.wrap(s, 40, max_lines=2))
# ['Python can be easy to pick up whether', "you're a first time programmer or [...]"]

print(textwrap.fill(s, 40, max_lines=2))
# Python can be easy to pick up whether
# you're a first time programmer or [...]

如果省略,默认情况下会在最后输出以下字符串。
' [...]'

它可以被任何带有参数占位符的字符串取代。

print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~'))
# Python can be easy to pick up whether
# you're a first time programmer or ~

你也可以用参数initial_indent指定一个字符串加在第一行的开头。这可以在你想缩进一个段落的开头时使用。

print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~', initial_indent='  '))
#   Python can be easy to pick up whether
# you're a first time programmer or ~

对全尺寸和半尺寸的字符要小心。

在textwrap中,字符数由字符数控制,而不是由字符宽度控制,单字节和双字节的字符都被视为一个字符。

s = '文字文字文字文字文字文字12345,67890, 文字文字文字abcde'

print(textwrap.fill(s, 12))
# 文字文字文字文字文字文字
# 12345,67890,
# 文字文字文字abcde

如果你想用固定宽度的混合汉字包住一个文本,请参考以下内容。

截断字符串(省略)。: shorten()

如果你想截断和省略字符串,请使用textwrap模块中的shorten()函数。

以字为单位进行缩写,以适应任意数量的字符。字符的数量,包括表示省略的字符串,是任意的。表示省略的字符串可以用参数placeholder来设置,它的默认值如下。
' [...]'

s = 'Python is powerful'

print(textwrap.shorten(s, 12))
# Python [...]

print(textwrap.shorten(s, 12, placeholder=' ~'))
# Python is ~

然而,例如,日语字符串不能很好地被缩写,因为它们不能被分割成单词。

s = 'Pythonについて。Pythonは汎用のプログラミング言語である。'

print(textwrap.shorten(s, 20))
# [...]

如果你想通过只考虑字符数而不是单词单位来进行缩写,可以很容易地实现,如下所示。

s_short = s[:12] + '...'
print(s_short)
# Pythonについて。P...

TextWrapper对象

如果你要用一个固定的配置多次进行wrap()或fill(),创建一个TextWrapper对象是很有效率的。

wrapper = textwrap.TextWrapper(width=30, max_lines=3, placeholder=' ~', initial_indent='  ')

s = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages"

print(wrapper.wrap(s))
# ['  Python can be easy to pick', "up whether you're a first time", "programmer or you're ~"]

print(wrapper.fill(s))
#   Python can be easy to pick
# up whether you're a first time
# programmer or you're ~

同样的设置可以重复使用。