欢迎大家扫码关注我的微信公众号:
Python 格式化输出-目录
一、 为何需要进行格式化输出
在开发过程中, 如果想要对程序进行调试就可能涉及到在控制台打印(输出)字符串。 正常的打印有时无法满足我们的需求, 而且如果一次打印过多的字符串, 由于其长度不一使我们不便观察。
这时, 我们就可以使用字符串的格式化输出。
二、 格式化输出的几种方式
2.1 使用 % 进行格式化
使用 % 可以将字符串进行格式化, 比如: 将长度分布在 6 ~ 10 之间的多个字符串进行左对齐(或右对齐)格式化输出, 或将多个小数位数不同的浮点数进行统一后输出等。
2.1.1 字符串的格式化
我们可以使用 % 在输出的时候进行占位, 然后将需要放进该位置的数据在后面用 % “塞” 进去, 如:
>>> print '这个是字符串的占位: %s' % '由我来顶替%s给我占的位置'
这个是字符串的占位: 由我来顶替%s给我占的位置
>>>
为了进行格式化输出, 我们可以在 % 和 s 之间采用数字将字符串进行格式化, 如:
>>> # 正常输出 "cybeyond"
... 'cybeyond'
'cybeyond'
>>> # 想要使本次输出占 30 个字符宽度, 并让 "cybeyond" 左对齐
... "%-30s" % "cybeyond"
'cybeyond '
>>> # 想要使本次输出占 30 个字符宽度, 并让 "cybeyond" 右对齐
... "%30s" % "cybeyond"
' cybeyond'
>>>
可以看到, 通过在 % 与 s 之间使用一个整型的数字, 就可以将字符串进行左对齐或右对齐输出。 其中, 正数代表要右对齐, 负数代表要左对齐。
注意: 当该数字不大于字符串的长度时, 没有任何变化, 如下面的例子所示, 如果数字小于字符串的长度时, 不会有任何变化:
>>> "%2s" % "cybeyond"
'cybeyond'
>>>
对于单个字符串我们可以采用上面的方法进行格式化输出, 但是如果一行输出至少两个数据, 而我们想分别进行左对齐和右对齐进行输出, 应该怎么办呢?
假如有如下程序:
>>> for exponent in range(7, 11):
... print exponent, 10 ** exponent
...
7 10000000
8 100000000
9 1000000000
10 10000000000
>>>
此时打印出来的四行数据没有对齐, 到了第四行的时候, 由于 10 是两位的, 导致了输出来的被推向了右侧而不对齐。 如果数据多了起来将更不好辨识。
此时我们可以使用两个 % 和 s 分别进行格式化:
>>> for exponent in range(7, 11):
... print "%-4s%20s" % (exponent, 10 ** exponent)
...
7 10000000
8 100000000
9 1000000000
10 10000000000
>>>
对于左边的 exponent, 我们采用了 4 个字符宽度的左对齐(%-4s), 对于右边的 10 ** exponent, 我们采用了 20 个字符宽度的右对齐(%20s)。如此一来想要对比数据便一目了然。
2.1.2 浮点数的格式化
使用 %s 可以为字符串的输出进行占位, 使用 %f 可以为浮点数的输出进行占位。
直接输出 3.14 和 3.14159:
>>> 3.14
3.14
>>> 3.14159
3.14159
>>>
如果想要整体占用 15 个字符宽度右对齐, 并保留 3 位小数, 可以参考字符串的格式化, 如下所示:
>>> "%15.3f" % 3.14
' 3.140'
>>> "%15.3f" % 3.14159
' 3.142'
>>>
未达到要求的字符宽度会用空格补充, 多出来的小数位数则被切掉。
如此一来, 便可将浮点数进行自定义格式化输出, 使小数点的位置对应起来, 分析方便。
2.2 使用 format 进行格式化
对于字符串的输出, 最常用的还有 format 方式, 如:
>>> "The string which print: {}".format("cybeyond")
'The string which print: cybeyond'
>>>
与 %s 占位方式的不同是 format 输出的时候, 我们需要在原字符串中用一对大括号 { } 进行占位, 如上例所示。
当我们想要同时输出多个字符串时, 使用多个大括号即可:
>>> "{}'s age is {}.".format("Cybeyond", "18")
"Cybeyond's age is 18."
>>>
当然, 如果第二个参数 “18” 换成整型的 18 可以得到同样的结果。 即: format 方式的格式化不用考虑要让大括号给何种数据类型占位, 只要 “占位” 了就可以在之后的 .format() 的括号中写入需要补位的数据。
注意: 无论使用 % 还是使用 { } 进行占位, 当占了多个位置时, 后面的补位数据必须在位置上一一对应。