7.5 string的格式化

string支持对数据的格式化,使得字符串能够按照某种格式显示出来。格式化字符串在服务器后台开发中可能还常用一些,在命令行的模式下,只能通过string的格式化使得输出的内容显得更规整一些。


在python中,string的format方法和系统的%操作都可以让string格式化,这里只介绍string的format方法。因为据说%操作会被干掉的。


string类型使用{}来表示占位符。format方法的参数会遵循某些规则来替换{}以及它里面的内容。

下面的例子当中,字符串中的两个{}表示了两个占位符;而format的参数1和2就是两个要替换的字符串(其实是数字,不过会自动转成字符串的。)





>>> '{} and{}'.format(1,2)



'1 and 2'

可以看到上面的代码中,参数1和2分别替换了两个{}占位符。


如果字符串里面本来有'{','}'这两个字符,则需要使用'{{'来表示'{',同样的,用'}}'来表示'}'。

format()的参数的数目是可变的,爱给它输入几个参数就输入几个参数。format的参数都有序号,第一个参数的序号是0,第二个参数的序号是1,以此类推。

{}占位符中可以指定替换的参数序号,如果不指定的话,系统会默认按出现顺序从0号参数开始替换。上面的代码中{}占位符就没有指定使用哪个序号的参数来替换,所以系统默认0号参数替换了第一个占位符,1号参数替换了第二个占位符。


下面的例子当中,第一个{}占位符指定要1号参数来替换,第二个{}占位符指定要0号参数来替换。






>>> '{1} and{0}'.format(1,2)



'2 and 1'

可以看到上述代码有了不一样的效果。


format()方法接受key参数。此时{}占位符可以通过key来指定参数。这个本来应该是函数一章的内容了,这里先演示一下。


以下的代码中format有两个参数,一个是key为a1的参数,另一个是key为a2的参数。而{}占位符中可以指定不同key值的参数来替换它。





>>> '{a1} and{a2}'.format(a1=1,a2=2)



'1 and 2'


如果format()的参数是list和dict类型的,{}占位符也可以通过序号、key等来获取。下面演示了format的参数是一个list,而第一项{}占位符取list的第一项、第二项{}占位符取list的第二项。





>>> nl=[1,2,3]



>>> '{0[0]} and{0[1]} and {0[2]}'.format(nl)



'1 and 2 and 3'


format接受的参数类型可能是五花八门的,可能是一个列表,甚至可能是一个函数。此时可能需要调用str ()或者repr()来把它转化为一个字符串。此时可以在 {}占位符中加入!s或者!r来进行转换。下面的代码就展示了使用!s操作来进行str(nl)。





>>>'{0!s}'.format(nl)



'[1, 2, 3]'


上面的内容都是在讲{}占位符如何指定参数以及对参数进行类型转换的。下面的内容主要是{}占位符中怎么定义数字的格式。


数字格式的定义以 ':' 号开始。碰到了': '字符就知道要定义一个数字的显示格式了。格式的定义顺序为 

[对齐方式(>右对齐、<左对齐、^居中)]

[+/-符号]

[#进制声明(具体是哪个进制在类型定义)]

[0填充]

[整数宽度]

[ ,千位分隔符]

[ .小数宽度]

[类型(b二进制、d十进制、x十六进制、f浮点数、%百分数、e科学计数法等等)]


这八种定义可以单个出现,也可以三三两两出现,也可以全部都出现。一般按照情况选取几种格式就可以了。不要搞得太复杂了,以免看着眼花。


下面的例子是数字右对齐,整数宽度是10.





>>>'{0:>10}'.format(9)



'         9'


下面的例子是居中对齐,整数宽度是10,进制是16进制。





>>>'{0:^#10x}'.format(30)



'   0x1e  '


下面的例子是小数宽度为2,并且使用百分数的形式.





>>> '{0:.2%}'.format(3.1415926)



'314.16%'


下面的例子是进行0填充,整数宽度为6,十进制表示.





>>>'{0:06d}'.format(25)



'000025'


下面的例子是对数据添加千位分隔符。





>>>'{0:,}'.format(123456789)



'123,456,789'