Python3 format() 函数详解 将字符串按照规则格式化
format()函数的主要作用是按照指定的规则对字符串进行格式化,可以替换固定位置的内容,也可以对字符串填充对齐、数字的格式处理等等。虽然看上去它只是一个简单的数据替换以及数据格式化,但是它真的不简单,它拥有非常多的功能,有负责的内容替换的,有负责数据转换的,还有负责数据格式化的,每个功能都有很多选项,接下来逐一讲解。
它是Python的内置函数,在python文件中直接可以使用。
语法
str.format(**args)
替换规则
字符串中包含由大括号{}包围的"替换字段",其中大括号中填写文本替换以及格式化规则,如果不填写规则(使用{}),则视为文本格式并且不对文本进行任何格式化,直接替换。文本也是比较常用的一种形式。
完整的格式如下:
{[field_name][!conversion][:format_spec]}
field_name - 替换命名方式
可以使用默认值、对象名称、对象属性名称、对象索引等的方式来指定需要替换内容。它是可选的,不填写按顺序替换内容。
命名方式含义示例
不填写不填写的情况下将按照顺序替换内容,在提供替换值时需要注意先后顺序,下面几种方式不受顺序控制。{}
arg_name直接使用对象的值{name}
arg_name.attribute_name获取对象的指定属性的值{name.first}
arg_name[element_index]获取对象的指定索引,可以是数字索引,也可以是字符串索引{name[0]} 或 {name['first']}
!conversion - 转换规则
替换后可以对替换的值使用转换函数进行直接转换,目前允许使用的转换函数有:str(),repr(),ascii(),在使用时需要书写它们对应的缩写,并以感叹号(!)开始。它是可选的,不填写就不转换。
选项含义示例
'r'调用repr()函数对值进行转换{!r}
's'调用str()函数对值进行转换{!s}
'a'调用ascii()函数对值进行转换{!a}
:format_spec - 格式化规则
在值被替换以及转换(如果设置的话)后还可以对值进行格式化,接下来将介绍各种格式化规则的用法。它是可选的,不填写就不格式化值。
需要说明一下:在下面的示例中会出现[format_spec]以及[!conversion],它们分别代表了文中提到的替换命名以及转换规则,由于它们是可选的,所有使用方括号括起来了,写在示例中只是为了体现他们的书写顺序,并不是一定存在。
格式化完整的参数如下:
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
§ fill - 字符
任何字符,只能是一个字符。fill是可选的,但是如果设置了fill,就必须和align搭配使用。
§ align - 对齐方式
选项含义示例
'<'强制字符串在可用空间内左对齐(这是大多数对象的默认值)。{:<}
'>'强制字符串在可用空间内右对齐(这是数字的默认值)。{:>}
'='强制在符号(如果有)与数字之间填充若干指定字符,被允许的符号只有'+'、'-'、' ' ,此方式只能应用在值为数字的情况时。{:[x]=+}
'^'强制字符串在可用空间内居中。{:^}
需要注意的是,如果没有设置填充宽度(width),宽度始终与填充它的数据大小相同,那么对齐选项就没有意义了。
另外,如果宽度设置的过小,比大部分数据的宽度都小。那么对齐的效果可能未必很好。
所以宽度最好设置的大于或等于数据的最大宽度,效果最佳。
§ sign - 符号
选项含义
'+'用于表示正数和负数
'-'用于表示仅用于负数(这是默认行为)
space用于表示正数为空格,负数为减号
§ # - 数字的格式
'#'选项仅对integer,float,complex和Decimal类型有效。
对于二进制、八进制、十六进制的整数,会在数字的增加前缀"0b"、'0o'、'0x'。
对于浮点数、复数和十进制组成的小数(Decimal),转换后的结果始终都包含小数点字符。
§ 0 - 数字的对齐
这是一个特殊的对齐方式,当没有明确给出对齐方式时,则在width选项前面加'0'字符可以为数字类型是字符0进行填充。这相当于填充字符'0',对齐类型为'='。
§ width - 最小填充宽度
width是定义最小数据宽度的十进制整数。如果未指定,则数据宽度将由内容长度确定。
§ grouping_option - 千位分隔符
选项含义示例
','使用逗号(,)对数字进行千位分割,每3位数字使用一次分隔符{:,}
'_'使用下划线(_)对数字进行千位分割,没3位数字使用一次分隔符{:_}
§ .precision - 字符精度
表示在使用'f'和'F'格式化的浮点数的小数点后应显示多少位数。
表示在使用'g'和'G'格式化的浮点数的小数点前后(整数位+小数位)应显示多少位数。
对于非数字类型,限制其显示的字符最大长度。
§ type - 数据类型
类型确定了应该如何呈现数据,不同的数据需要使用不同的类型。
用于表示字符串类型:
类型含义
's'字符串格式,这是字符串的默认类型,可以省略。
None(不设置)和's'类型一样
用于表示整数类型:
类型含义
'b'将整数转换为二进制格式
'c'将整数转换为相应的unicode字符
'd'将整数转换为十进制格式
'o'将整数转换为八进制格式
'x'将整数转换为十六进制格式,以小写字母表示9以上的数字。
'X'将整数转换为十六进制格式,以大写字母表示9以上的数字。
'n'在一般情况下与'd'类型相同,但是在不同的语言环境可能显示不同,它会适当的插入数字分隔符。在中文语言环境是没有分隔符的。可以使用locale模块进行切换。
None和'd'类型一样
用于浮点和小数值类型:
类型含义
'e'将数字转换为以科学计数法表示的指数,默认精度为6。
'E'和'e'类型相同,只是它使用大写'E'作为分隔符。
'f'将固定保留小数点后6位,如果原数字小数点后位数超过6位且第7位大于5,则第6位+1,但第7位等于5时,则要看是否存在第8位且大于0,如大于0,第6位也+1,如果原数字小数点后不足6位的,则以0补充。如果指定了精度则按上述规则推算即可。
'F'与'f'类型相同,只是它会将nan转换为NAN,将inf转换为INF。
'g'一般格式,在未设置精度的情况下,它保留6位数(整数+小数),根据实际情况选择以固定位数或者科学计数法格式化结果,结果后面如果存在多余的0将会被舍去。有以及几种规则:如果整数位已经等于精度,则舍掉所有小数,并且以小数的第一位四舍五入进整数;如果整数位大于精度,则以exp指数的形式格式化,以精度位的下一位作为判断依据四舍五入;如果整数位不足精度位数,则使用小数位补充,不存在小数位或者整数位+小数位不足精度,则显示完整数字;如果整数位不足精度位数,且小数位大于剩余精度,则截取小数位剩余精度,以后一位小数为判断是否舍去还是进一,如后一位小数大于5,则进一,如后一小数小于5,则舍去,如后一位小数等于5且后二位小数大于0,则进一。
'G'与'g'类似一样,只是exp指数的'e'则会变为大写的'E',并且inf和nan也会变位INF和NAN。
'n'在一般情况下与'g'类型相同,但是在不同的语言环境可能显示不同,它会适当的插入数字分隔符。在中文语言环境是没有分隔符的。可以使用locale模块进行切换。
'%'在未指定精度的情况下,将数字乘以100,以'f'类型进行格式化,并在末尾加上百分号'%'。
None与'g'类型相似,只是在固定位数设置时,最少要有一位小数,否则会报错。
实例
§ 实例1 - 替换命名
#不填写命名
>>>"{}, {}, {}".format('a', 'b', 'c')
'a, b, c'
#使用数字索引指定顺序
>>>"{0}, {1}, {2}".format('a', 'b', 'c')
'a, b, c'
>>>"{2}, {1}, {0}".format('a', 'b', 'c')
'c, b, a'
#使用变量名称
>>>day = 'Monday'
>>>month = 'February'
>>>"{month}, {day}".format(month = month, day = day)
'February, Monday'
#使用对象属性
>>>class date:
... day = 'monday'
... month = 'February'
...
>>>o = date()
>>>"{date.day}, {date.month}".format(date = o)
'monday, February'
#使用字典键名
date = {
'day': 'Monday',
'month': 'February'
}
"{date[day]}, {date[month]}".format(date = date)
§ 实例2 - 转换函数
#使用repr()函数转换值。
>>>"{!r}".format('abc')
"'abc'"
#使用ascii()函数转换值。
>>>"{!a}".format('测试')
"'\\u6d4b\\u8bd5'"
#使用str()函数转换值,返回str对象。
>>>"{!s}".format(123)
'123'
§ 实例3 - 格式化规则
#左对齐
>>>'{:<5}{:<5}{:<5}'.format(1,2,3)
'1 2 3 '
#右对齐
>>>'{:>5}{:>5}{:>5}'.format(1,2,3)
' 1 2 3'
#居中对齐
>>>'{:^5}{:^5}{:^5}'.format(1,2,3)
' 1 2 3 '
#默认空格填充,可以自定义
>>>'{:*^5}{:-^5}{:#^5}'.format('1','2','3')
'**1**--2--##3##'
#带符号使用0填充
>>>'{:0=+5}'.format(1)
'+0001'
>>>'{:0=+5}'.format(-1)
'-0001'
#千位分割
>>>"{:,}".format(123456789)
'123,456,789'
>>>"{:_}".format(123456789)
'123_456_789'
#属性0和width合用,相同于按照width宽度使用0填充。
>>>"{:07}".format(1)
'0000001'
#设置精度,整数+小数位。
>>>"{:.5}".format(12.3456789)
'12.346'
#二进制
>>>"{:b}".format(30)
'11110'
#八进制
>>>"{:o}".format(30)
'36'
#十进制
>>>"{:d}".format(30)
'30'
#十六进制(e小写)
>>>"{:x}".format(30)
'1e'
#十六进制(E小写)
>>>"{:X}".format(30)
'1E'
#使用科学计数法
>>>"{:e}".format(123456)
'1.234560e+05'
#'E'大写
>>>"{:E}".format(123456)
'1.234560E+05'
#固定留小数点后6位,不足用0补充
>>>"{:f}".format(123.456)
'123.456000'
>>>"{:f}".format(123.4567890)
'123.456789'
#百分比 - 固定小数点留2位
>>>"{:.2%}".format(123.456789)
'12345.68%'