【编程课堂】文本包装 textwrap

欢迎回到编程课堂,本周我们将了解一个与文字处理相关的模块—— 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 参数所规定的字符数,返回一个包装过的字符串。

>>> 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)

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

>>> text = 'module provides some convenience functions.'
>>> print(textwrap.shorten(text, 20))
module [...]
# placeholder 参数修改结尾形式
>>> print(textwrap.shorten(text, 20, placeholder='...'))
module...

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

textwrap.dedent(text)

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

>>> text = '''
    hello,
      world
'''
>>> print(textwrap.dedent(text))

hello,
  world

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

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

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

>>> text = 'hello,\nworld'
>>> print(textwrap.indent(text,'+'))
+hello,
+world

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

好在还有一条出路:

textwrap 模块中的 TextWrapper

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

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)

输出结果

+The module provides
+some convenience
+functions

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

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

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

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2017-03-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端杂货铺

前端开发中的字符编码

前端开发过程中会接触各种各样的编码,比较常见的主要是UTF-8和HTML实体编码,但是web前端的世界却不止这两种编码,而且编码的选择也会造成一定的问题,如前后...

36480
来自专栏Jackson0714

PHP内核之旅-3.变量

16640
来自专栏绿巨人专栏

TypeScript中的怪语法

54350
来自专栏决胜机器学习

PHP数据结构(三)——运用栈实现括号匹配

PHP数据结构(三)——运用栈实现括号匹配 (原创内容,转载请注明来源,谢谢) 栈在数据结构上是一种特殊的线性表,其限制是仅允许在表的一端进行插入和删除运算,...

45260
来自专栏Golang语言社区

JS基础(下)

事件DOM Event 更多事件请查询h3c htmldom参考手册 event onclick() :当点击时 onfocus() :获得焦点时 ;当...

54070
来自专栏Java3y

JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】

什么是EL表达式? 表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来...

54270
来自专栏IMWeb前端团队

【译】使用箭头函数精简你的 Vue 模块

本文作者:IMWeb ShiJianwen 原文出处:IMWeb社区 未经同意,禁止转载 原文链接:https://dotdev.co/clean-...

30180
来自专栏Jerry的SAP技术分享

使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)

Java程序员面试系列-什么是Java Marker Interface(标记接口)

11630
来自专栏小灰灰

SPI框架实现之旅二:整体设计

SPI框架实现之旅二:整体设计 上一篇简单的说了一下spi相关的东西, 接下来我们准备开动,本篇博文主要集中在一些术语,使用规范的约定和使用方式 设计思路 下...

38580
来自专栏王磊的博客

vuejs深入浅出—基础篇

一、从HelloWorld说起 任何语言的都是从Hello World开始的,VueJs也不例外,直接上代码: <script src="https://unp...

33860

扫码关注云+社区

领取腾讯云代金券