【前言】本文主要介绍python中的字符串格式化,通过基本概念,使用方法及例子学习python字符串格式化的两种主要形式:字符串格式化表达以及字符串格式化方法调用。
0. python字符串格式化
字符串格式化允许在一个单个的步骤中对一个字符串执行多个特定类型的替换,特别是给用户提示的时候,格式化非常方便。如今的python中的字符串格式化可以以两种形式实现:
字符串格式化表达式
基于C语言的“printf”模型,并且在大多数的代码中使用。在表达式中,我们使用%二进制操作符对字符串进行格式化,%操作符为编写多字符串提供了一种简洁的方法。
字符串格式化方法调用
这是python 2.6和python 3.0新增的一种格式化字符串的方法str.format(),通过{}和字符串对象的format方法代替字符串格式化表达式%
1. 字符串格式化表达式
格式化字符串表达式的定义如下:
1. 在%操作符的左侧放置一个需要进行格式化的字符串,这个字符串带有一个或多个嵌入的转换目标,都以%开头(e.g., %d).
2. 在%d操作符右侧放置一个(或多个,嵌入到元组中)对象,这些对象将会插入到左侧想让python进行格式化字符串的一个(或多个)转换目标的位置上去。
>>> '%s -- %s -- %s' % (42, 3.1415926, [1, 2, 3])
"42 -- 3.1415926 -- [1, 2, 3]"
注意到上述例子在字符串插入三个值,类型分别为:整数, 浮点数对象, 列表对象。但是所有目标左侧都是 ‘%s’, 这就表示把它们转换为字符串。由于对象的每个类别都可以转换为字符串(打印时使用),每一个与’%s’一同参与操作的对象类型都可以转换代码。因此,除非需要做特殊的格式化,一般用’%s’就可以格式化表达式。
转换目标的通用结构:
%[(name)][flags][width][.precision] typecode
%[对齐] [索引:] [占位符(填充符号)] [最小占位宽度] [.精度 ] [限定符] 标识格式符 (c,s,d,o,f,x,X...)
python字符串格式化符号:
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串(或任何对象) |
%d | 格式化整数(十进制) |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数(大写E) |
%g | 根据值的大小决定使用%f活%e |
%G | 作用同%g,根据值的大小决定使用%f活%e |
%p | 用十六进制数格式化变量的地址 |
格式化操作符辅助指令:
符号 | 功能 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
sp | 在正数前面显示空格 |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%’输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
例子:你可以在格式化字符串中用一个*来指定通过计算得出width和precision,从而迫使它们的值从%运算符右边的输出中的下一项获取,在这里,元组中的4指定为precision:
>>>
>>> "%f, %.2f, %.*f" % (1/3.0, 1/3.0, 4, 1/3.0)
'0.333333, 0.33, 0.3333'
>>>
基于字典的字符串格式化
字符串中的格式化同时也允许左边的转换目标来引用右边字典中的键来提取对应的值:
>>>
>>> "%(n)d %(x)s" % {"n":1, "x":"spam"}
'1 spam'
>>>
上例中,格式化字符串里(n)和(x)引用了右边字典中的键,并提取它们对应的值。生成类似HTML或XML的程序往往利用了这一技术:你可以建立一个数值字典,并利用一个基于键的引用的格式化表达式一次性替代它们:
>>> reply = """
... Greetings...
... Hello %(name)s !
... Your age squared is %(age)s
... """
>>> values = {'name':'Solomon', 'age':18}
>>> print(reply % values)
Greetings...
Hello Solomon !
Your age squared is 18
>>>
python中三引号可以将复杂的字符串进行复制, python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
2. 字符串格式化调用方法
python 2.6和python 3.0(及其以后的版本)中的新的字符串对象的format方法使用主体字符串作为模板,并且接受任意多个表示将要根据模板替换的值的参数。在主体字符串中,花括号{}通过位置(e.g., {1})或关键字(e.g., {food})指出替换目标及将要插入的参数。
“映射”示例
通过位置
>>> '{0},{1}'.format('Solomon',24)
'Solomon,24'
>>> '{},{}'.format('Trump',70)
'Trump,70'
>>> '{1},{0},{1}'.format('Hillary',69)
'69,Hillary,69'
>>>
字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次,不过2.6不能为空{},2.7才可以。
通过关键字参数
'{name},{age}'.format(age=18,name='kzc')
通过对象属性
... def __init__(self,name,age):
... self.name,self.age = name,age
... def __str__(self):
... return 'This guy is {self.name},is {self.age} old'.format(self=self)
...
>>>
>>> str(Person('Solomon', 24))
通过下标
>>> str = ['Solomon', 24]
>>> '{0[0]},{0[1]}'.format(str)
'Solomon,24'
>>>
基本的Python知识告诉我们,list和tuple可以通过“打散”成普通参数给函数,而dict可以打散成关键字参数给函数(通过和*)。所以可以轻松的传个list/tuple/dict给format函数。非常灵活。
格式限定符
它有着丰富的的“格式限定符”(语法是{}中带:号),比如——
填充与对齐
填充常跟对齐一起使用
^、<、>分别是居中、左对齐、右对齐,后面带宽度
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充
比如
>>> '{:<9}'.format('1992')
'1992 '
>>> '{:>9}'.format('1992')
' 1992'
>>> '{:0>9}'.format('1992')
'000001992'
>>> '{:0<9}'.format('1992')
'199200000'
>>> '{:a<9}'.format('1992')
'1992aaaaa'
>>>
精度与类型f
精度常跟类型f一起使用
>>> '{:.2f}'.format(3.1415926)
'3.14'
>>>
其中.2表示长度为2的精度,f表示float类型。
其他类型
主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制。
>>> '{:b}'.format(9)
'1001'
>>> '{:d}'.format(9)
'9'
>>> '{:o}'.format(9)
'11'
>>> '{:x}'.format(9)
'9'
>>>
用‘,’号还能用来做金额的千位分隔符。
>>> '{:,}'.format(1234567890)
'1,234,567,890'
>>>
Reference
[1] 爱做梦的鱼. Python中的字符串处理
http://www.cnblogs.com/dreamer-fish/p/3818443.html
[2] mattkang. 飘逸的python - 增强的格式化字符串format函数
http://blog.csdn.net/handsomekang/article/details/9183303