前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【编程课堂】文本包装 textwrap

【编程课堂】文本包装 textwrap

作者头像
Crossin先生
发布2018-04-17 12:06:58
9030
发布2018-04-17 12:06:58
举报
文章被收录于专栏:Crossin的编程教室

欢迎回到编程课堂,本周我们将了解一个与文字处理相关的模块—— textwrap,依照惯例,此处应该有一思考题:

现在有一文本文件 ‘abc.txt’,有 1000 行内容,现在需要在每一行的开头添加一个 ‘+’ 字符,该怎么做呢?

各位思考下,我们先按下不表。

来看看官方文档中关于 textwrap 模块的说明:

The textwrap module provides some convenience functions, as well as TextWrapper, the class that does all the work. If you’re just wrapping or filling one or two text strings, the convenience functions should be good enough; otherwise, you should use an instance of TextWrapper for efficiency.

似乎没怎么说清楚,只讲了该模块提供了一些便捷的方法和一个 TextWrapper 类,用来包装填充字符串。

没关系,我们来看其中具体的函数:

textwrap.fill(text, width=70, **kwargs)

包装一段文字,使其每行不超过 width 参数所规定的字符数,返回一个包装过的字符串。

代码语言:javascript
复制
>>> text = 'module provides some convenience functions.'
>>> print(textwrap.fill(text,width=10))
module
provides
some conve
nience
functions.

这个函数可以用来做自动换行,不过值得注意的是,如果是中文,在 python2 中需使用 unicode,否则会因换行而产生乱码。

textwrap.shorten(text, width, **kwargs)

以一定的长度截取一段文字内容。

代码语言:javascript
复制
>>> text = 'module provides some convenience functions.'
>>> print(textwrap.shorten(text, 20))
module [...]
# placeholder 参数修改结尾形式
>>> print(textwrap.shorten(text, 20, placeholder='...'))
module...

这里,限定的最大长度是要包含结尾占位符的。另外,在截取时会依据单词进行分割,所以这个函数对于中文的支持比较差,无法正确截取:它会把不带空格的中文当做一整个单词来处理。

textwrap.dedent(text)

将多行文字统一去除缩进。

代码语言:javascript
复制
>>> text = '''
    hello,
      world
'''
>>> print(textwrap.dedent(text))

hello,
  world

它并不是去掉每一行前的空格,而是去除掉每行开始都共同含有的多余空格。所以行与行直接的相对缩进仍然会保留。

textwrap.indent(text, prefix, predicate=None)

在文本每一行的开头添加词头。 prefix 参数为词头,predicte 参数控制选中行,默认为除了空行之外的所有行。

代码语言:javascript
复制
>>> text = 'hello,\nworld'
>>> print(textwrap.indent(text,'+'))
+hello,
+world

这好像就满足我们开头提到的那个需求了吧?But!这个函数是在 Python 3.3 新加的,2.7 是没有的。

好在还有一条出路:

textwrap 模块中的 TextWrapper

TextWrapper 的包含了上述几个函数的功能,只多不少。可通过构造函数初始化或者直接修改实例变量设定你需要的包装参数。

代码语言:javascript
复制
text = 'The module provides some convenience functions'
# 初始化“包装器”
wrapper = textwrap.TextWrapper()
# 每行最大长度
wrapper.width = 20
# 第一行词头
wrapper.initial_indent = '+'
# 非首行词头
wrapper.subsequent_indent = '+'
# 最后填充文本
result = wrapper.fill(text)
print(result)
输出结果
代码语言:javascript
复制
+The module provides
+some convenience
+functions

TextWrapper 里还有一些属性,比如限定最大行数、设定 tab 键长度等,这里不一一说明,可查阅官方文档

https://docs.python.org/2/library/textwrap.html

也许对你做文字处理会有帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • textwrap.fill(text, width=70, **kwargs)
  • textwrap.shorten(text, width, **kwargs)
  • textwrap.dedent(text)
  • textwrap.indent(text, prefix, predicate=None)
    • 输出结果
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档