Python中字符串格式化str.format的详细介绍


Posted in Python onFebruary 17, 2017

前言

Python 在 2.6 版本中新加了一个字符串格式化方法: str.format() 。它的基本语法是通过 {} 和 : 来代替以前的 %.。

格式化时的占位符语法:

replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

“映射”规则

通过位置

str.format() 可以接受不限个参数,位置可以不按顺序:

>>> "{0} {1}".format("hello", "world")
'hello world'
>>> "{} {}".format("hello", "world")
'hello world'
>>> "{1} {0} {1}".format("hello", "world")
'world hello world'

通过关键字参数

使用关键参数时字符串中需要提供参数名:

>>> "I am {name}, age is {age}".format(name="huoty", age=18)
'I am huoty, age is 18'
>>> user = {"name": "huoty", "age": 18}
>>> "I am {name}, age is {age}".format(**user)
'I am huoty, age is 18'

通过对象属性

str.format() 可以直接读取用户属性:

>>> class User(object):
...  def __init__(self, name, age):
...   self.name = name
...   self.age = age
...   
...  def __str__(self):
...   return "{self.name}({self.age})".format(self=self)
...  
...  def __repr__(self):
...   return self.__str__()
...  
...
>>> user = User("huoty", 18)
>>> user
huoty(18)
>>> "I am {user.name}, age is {user.age}".format(user=user)
'I am huoty, age is 18'

通过下标

在需要格式化的字符串内部可以通过下标来访问元素:

>>> names, ages = ["huoty", "esenich", "anan"], [18, 16, 8]
>>> "I am {0[0]}, age is {1[2]}".format(names, ages)
'I am huoty, age is 8'
>>> users = {"names": ["huoty", "esenich", "anan"], "ages": [18, 16, 8]}
>>> "I am {names[0]}, age is {ages[0]}".format(**users)

指定转化

可以指定字符串的转化类型:

conversion ::= "r" | "s" | "a"

其中 "!r" 对应 repr(); "!s" 对应 str(); "!a" 对应 ascii()。 示例:

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

格式限定符

填充与对齐

填充常跟对齐一起使用。^, <, > 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。

>>> "{:>8}".format("181716")
' 181716'
>>> "{:0>8}".format("181716")
'00181716'
>>> "{:->8}".format("181716")
'--181716'
>>> "{:-<8}".format("181716")
'181716--'
>>> "{:-^8}".format("181716")
'-181716-'
>>> "{:-<25}>".format("Here ")
'Here -------------------->'

浮点精度

用 f 表示浮点类型,并可以在其前边加上精度控制:

>>> "[ {:.2f} ]".format(321.33345)
'[ 321.33 ]'
>>> "[ {:.1f} ]".format(321.33345)
'[ 321.3 ]'
>>> "[ {:.4f} ]".format(321.33345)
'[ 321.3335 ]'
>>> "[ {:.4f} ]".format(321)
'[ 321.0000 ]'

还可以为浮点数指定符号,+ 表示在正数前显示 +,负数前显示 -; (空格)表示在正数前加空格,在幅负数前加 -;- 与什么都不加({:f})时一致:

>>> '{:+f}; {:+f}'.format(3.141592657, -3.141592657)
'+3.141593; -3.141593'
>>> '{: f}; {: f}'.format(3.141592657, -3.141592657)
' 3.141593; -3.141593'
>>> '{:f}; {:f}'.format(3.141592657, -3.141592657)
'3.141593; -3.141593'
>>> '{:-f}; {:-f}'.format(3.141592657, -3.141592657)
'3.141593; -3.141593'
>>> '{:+.4f}; {:+.4f}'.format(3.141592657, -3.141592657)
'+3.1416; -3.1416'

指定进制

>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(18)
'int: 18; hex: 12; oct: 22; bin: 10010'
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(18)
'int: 18; hex: 0x12; oct: 0o22; bin: 0b10010'

千位分隔符

可以使用 "," 来作为千位分隔符:

>>> '{:,}'.format(1234567890)
'1,234,567,890'

百分数显示

>>> "progress: {:.2%}".format(19.88/22)
'progress: 90.36%'

事实上,format 还支持更多的类型符号:

type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

其他技巧

占位符嵌套

某些时候占位符嵌套还是很有用的:

>>> '{0:{fill}{align}16}'.format("hello", fill='*', align='^')
'*****hello******'
>>>
>>> for num in range(5,12):
...  for base in "dXob":
...   print("{0:{width}{base}}".format(num, base=base, width=5), end=' ')
...  print()
...  
...
 5  5  5 101
 6  6  6 110
 7  7  7 111
 8  8 10 1000
 9  9 11 1001
 10  A 12 1010
 11  B 13 1011

作为函数使用

可以先不指定格式化参数,而是在不要的地方作为函数来调用:

>>> email_f = "Your email address was {email}".format
>>> print(email_f(email="suodhuoty@gmail.com"))
Your email address was sudohuoty@gmail.com

转义大括号

当在字符串中需要使用大括号时可以用大括号转义:

>>> " The {} set is often represented as { {0} } ".format("empty")
' The empty set is often represented as {0} '

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python使用百度翻译进行中翻英示例
Apr 14 Python
python通过scapy获取局域网所有主机mac地址示例
May 04 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
python样条插值的实现代码
Dec 17 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 Python
python Tornado框架的使用示例
Oct 19 Python
python使用pymysql模块操作MySQL
Jun 16 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 #Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 #Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 #Python
Python之日期与时间处理模块(date和datetime)
Feb 16 #Python
python字符串中的单双引
Feb 16 #Python
使用PyV8在Python爬虫中执行js代码
Feb 16 #Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 #Python
You might like
PHP个人网站架设连环讲(四)
2006/10/09 PHP
javascript 写类方式之七
2009/07/05 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
原生js实现日期联动
2015/01/12 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
python计算二维矩形IOU实例
2020/01/18 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
售后专员岗位职责
2013/12/08 职场文书
教师自荐信
2013/12/10 职场文书
农民致富事迹材料
2014/01/23 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
垃圾桶标语
2014/06/24 职场文书
股东授权委托书
2014/10/15 职场文书
个人事迹材料范文
2014/12/29 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL