Python实现字符串格式化的方法小结


Posted in Python onFebruary 20, 2017

Python2.6+ 增加了str.format函数,用来代替原有的'%'操作符。它使用比'%'更加直观、灵活。下面详细介绍一下它的使用方法。

下面是使用'%'的例子:

""
"PI is %f..." % 3.14159 # => 'PI is 3.141590...'
"%d + %d = %d" % (5, 6, 5+6) # => '5 + 6 = 11'
"The usage of %(language)s" % {"language": "python"} # => 'The usage of python'

格式很像C语言的printf是不是?由于'%'是一个操作符,只能在左右两边各放一个参数,因此右边多个值需要用元组或者字典来包括,不能元组字典一起用,缺乏灵活度。

同样的例子用format方法改写:

"PI is {0}...".format(3.14159) # => 'PI is 3.14159...'
"{0} + {1} = {2}".format(5, 6, 5+6) # => '5 + 6 = 11'
"The usage of {language}".format(language = "Python") # => 'The usage of Python'

是不是很直观?(当然,使用C语言的我也很喜欢前一种格式表达方式 :-) )

格式化字符串

"{named} consist of intermingled character {0} and {1}".format("data", "markup", \
  named = "Formats trings")
format(10.0, "7.3g") # => '   10'
"My name is {0} :-{{}}".format('Fred') # => 'My name is Fred :-{}'

注意第一行的'\',如果一个语句要换行,必须在结尾加上反斜线转义。

用'%'无法像这样将元组和字典混用。其实这里是命名参数,Python的一个特性。可以在定义数组的时候用*args, **kwargs语法展开集合和字典。需要注意,命名参数放在后面。

第二个语句表示format内置函数用来格式化单个值。

第三个语句表示了{}的转义,因为{}在被格式化字符串里是特殊字符,不能直接显示。转义方式是多嵌套一层。

使用属性和索引

"My name is {0.name}".format(open('out.txt', 'w')) # => 'My name is out.txt'

'{0.name}' 相当于调用对象的属性 open('out.txt', 'w').name

"My name is {0[name]}".format(dict(name='Fred')) # => 'My name is Fred'

使用索引也是可以的。

obj[key] 相当于 obj.____getitem____('key')

标准说明符(Specifiers)

写过C语言的程序员应该清楚printf的复杂。format也定义了很多标准的说明符,用来解释一个值的格式,然后插入字符串内。例如:

"My name is {0:8}".format('Fred') # => 'My name is Fred  '

':'之后便是说明符了,上面例子中说明符只有一个'8'(minimumwidth),它表示插入的值宽度至少为8。'Fred'只有4,所以又加了4个空格。

说明符的详细格式为:

[[fill]align][sign][#][0][minimumwidth][.precision][type](不比C的printf更简洁啊!)

注意:'[]'表示该元素可选。所以,所有的格式说明符都是可选的!就像之前的例子,几乎都没有用这个(只是为了例子更清晰)。实际上,这些是很有用的。

我们一个个来看:
1、[fill]align 表示排列方式。当minimumwidth设置的比插入的值大时,就有了留白,就像上一个例子中的'My name is Fred '。默认把留白放在了右边,也就是说插入值默认是左对齐的。如果我们试试{0:>8},会发现结果变成了'My name is Fred'。
fill 表示用来填充留白的字符。只有在align指定了的情况下fill才有用! align可以是下面的标识:

  •  < 左对齐,默认
  • > 右对齐
  • = 将留白放在align标识后面,只对数字有效。什么意思呢?align下面会讲到,显示数字的正负号,同样只对数字有效。如果指定了'=',那么就会把数字的正负号显示在留白的前面。例如:format(-12, "0=8") # => '-0000012'注意这里用的是格式化单个值的内置函数format。'0'是fill元素,用它来填充留白;'='就是该标识了;'8'是指最小宽度为8,因此才有5个留白。那么align呢?align其实就是说明正负号的显示方式,这里使用默认的'-',之后会讲到。
  • ^ 居中对齐

2、sign 数字符号,只对数字有效。

  • + 显示加号和减号
  • - 不显示加号,显示减号。在不指定最小宽度的情况下负数总是比正数多占一个符号位置。默认
  • ' ' (一个空格) 用一个留白代替加号

3、# 显示数字的前缀表示几进制(0b, 0o, 0x)

4、0 用'0'填充留白。

5、minimumwidth 指定最小宽度,已经用过很多次了。

6、.precision 'precision'是一个十进制数字,表示显示小数点后几位。

7、type 值的类型:

①整型:

  •  b 二进制
  • c 字符型,把数字转成表示unicode的字符
  • d 十进制
  • o 八进制
  • x 十六进制,显示小写字母
  • X 十六进制,显示大写字母
  • n 与d行为相同,使用本地的数字表示方式
  • ''(空,没有空格) 与d相同

②浮点数

  • e 科学计数法表示,小写e
  • E 科学计数法表示,大写E
  • f 显示为定点数,默认小数点后六位
  • F 同f
  • g 自动选择是否用科学记数法表示
  • G 同g
  • n 同g,使用本地表示方式
  • % 使用百分比表示
  • ''(空) 同g

每个对象可以重写自己的格式化说明符,例如datatime类重写了后可以这样表示:

"Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())

预先转换

':'之后是格式说明符,之前还可以加预先转换的标识

  • !r 调用对象的_repr_方法来转换成标准字符串
  • !s 调用对象的_str_方法来转换成字符串

重写_format_方法

我们在格式化一个字符串时,首先格式化每个值,然后再插入字符串内。格式化值调用的就是format内置方法。format则是简单地调用该值的_format_方法。

def format(value, format_spec):
  return value.__format__(format_spec)

在object类内实现了_format方法,只是将本身用str()转换成字符串,然后将字符串传入内置的format方法,实际上就是调用转换为字符串后的format_方法。

class object:
  def __format__(self, format_spec):
    return format(str(self), format_spec)

int/float/str自身实现了_format_方法,前面已经介绍了它们各自的说明符。

结束语

还有一点儿是自定义Formatter,不过平常也用不到。留作下篇string模块源码解读的内容吧。建议有兴趣的朋友多看看Python标准库的源码,很有学习价值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
举例讲解Python中的list列表数据结构用法
Mar 12 Python
常见的python正则用法实例讲解
Jun 21 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
selenium处理元素定位点击无效问题
Jun 12 Python
python实现名片管理器的示例代码
Dec 17 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
浅谈Python中的函数(def)及参数传递操作
May 25 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 #Python
Python 模块EasyGui详细介绍
Feb 19 #Python
Python中字符串格式化str.format的详细介绍
Feb 17 #Python
Python爬虫:通过关键字爬取百度图片
Feb 17 #Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 #Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 #Python
Python之日期与时间处理模块(date和datetime)
Feb 16 #Python
You might like
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
php生成图片验证码的方法
2016/04/15 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
python re模块和正则表达式
2021/03/24 Python
vue实现倒计时功能
2021/03/24 Vue.js
政府采购方案
2014/06/12 职场文书
病房管理制度范本
2015/08/06 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js