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通过post提交数据的方法
May 06 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
Jan 17 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
Python中新式类与经典类的区别详析
Jul 10 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
Python 实现一个简单的web服务器
Jan 03 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 Python
Python制作春联的示例代码
Jan 22 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
文章推荐系统(三)
2006/10/09 PHP
常用的php ADODB使用方法集锦
2008/03/25 PHP
php的hash算法介绍
2014/02/13 PHP
php检测url是否存在的方法
2015/04/14 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
JS高级笔记
2011/07/13 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
js数组去重的hash方法
2016/12/22 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
JavaScript实现网页动态生成表格
2020/11/25 Javascript
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
pandas中去除指定字符的实例
2018/05/18 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
Django框架封装外部函数示例
2019/05/28 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
python线程里哪种模块比较适合
2020/08/02 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
毕业晚会主持词
2014/03/24 职场文书
优质服务活动实施方案
2014/05/02 职场文书
无保留意见审计报告
2015/06/05 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python