要在Python中通过包装(断行)和截断(缩写)一个任意数目的字符来格式化一个字符串,可以使用标准库的textwrap模块。
这里提供了以下信息。
- 包裹一个字符串(换行):
wrap()
,fill()
- 截断字符串(省略)。:
shorten()
- TextWrapper对象
如果你想把长字符串写在代码中的多行上,而不是写在输出中,请看下面的文章。
- 相关文章。用Python在多行上写长串文本
包裹一个字符串(换行): 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 ~
同样的设置可以重复使用。