概述
格式化字符串语法,经常被使用。除了基本的'{}'.format(1)位置和'{name}'.format(name="name")格式化字符串还具有非常强大的功能,在工作中偶尔会用到,每次都得查一下很烦,所以写篇文章记录一下。
以下是官方文档中给出的规则描述
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | digit+]
attribute_name ::= identifier
element_index ::= digit+ | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s" | "a"
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= digit+
grouping_option ::= "_" | ","
precision ::= digit+
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
解释一下符号的含义:
- ::=左边是声明的一个概念名称, 右边是具体的规则
- "" 表示具体的某个字符
- []表示该部分可选
- |代表多选一
- <>中是描述信息
- +表示一个或者多个
*表示0个或多个
指定格式化的参数 [field_name]
默认值
"{}{}".format(1,2) 等价于 "{0}{1}.format(1,2)"
支持替换位置参数(*args)和命名参数(**kwargs)
In [6]: "{2}{1}{0}".format('a', 'b', 'c')
Out[6]: 'cba'
In [7]: "{a}{b}{c}".format(a='a', b='b', c='c')
Out[7]: 'abc'
In [8]: "{a}{1}{b}{0}{c}".format('x', 'y', a='a', b='b', c='c')
Out[8]: 'aybxc'
支持属性和元素访问
In [22]: "{[0]}".format(['a'])
Out[22]: 'a'
In [23]: "{0[0]}".format(['a'])
Out[23]: 'a'
In [24]: "{0['a']}".format({'a': 1})
KeyError: "'a'"
In [25]: "{o.__name__}".format(o=object)
Out[25]: 'object'
指定参数转化成字符的方法 [!conversion]
**支持repr() ascii() str()三种转化方式, 默认str()
"".format('中文')
In [47]: "{!s}".format('中文') == str('中文')
Out[47]: True
In [48]: "{!r}".format('中文') == repr('中文')
Out[48]: True
In [49]: "{!a}".format('中文') == ascii('中文')
Out[49]: True
In [56]: "{}".format('中文') == str('中文')
Out[56]: True
字符的排版 [:format_spec]
字符默认宽度和填充 [fill][width]
In [133]: "{:05}".format(1)
Out[133]: '00001'
In [134]: "{: 5}".format(1) # 默认
Out[134]: ' 1'
一些填充无法使用一些特殊的字符,比如*,,等
In [136]: "{:*5}".format(1)
ValueError: Invalid format specifier
对齐方式 [align]
- <, >, ^分别对应左对齐,右对齐,居中对齐
In [142]: "{:>10}".format('right')
Out[142]: ' right'
In [143]: "{:<10}".format('left')
Out[143]: 'left '
In [144]: "{:^10}".format('center')
Out[144]: ' center '
- 当数字显示为带符号的情况下默认的处理方式符号将紧根数字,=符号可以强行将符号放在填充字符的前面
In [140]: "{:=10}".format(-1)
Out[140]: '- 1'
In [141]: "{:10}".format(-1)
Out[141]: ' -1'
数字符号处理 [sign]
- :<空格>, +不会显示会用空格进行替代
In [112]: "{: }".format(-1)
Out[112]: '-1'
In [113]: "{: }".format(1)
Out[113]: ' 1'
- :- (默认值),正数不显示符号,负数显示
In [116]: "{:-}".format(-1)
Out[116]: '-1'
In [117]: "{:-}".format(1)
Out[117]: '1'
- :+,正负号都显示
In [114]: "{:+}".format(1)
Out[114]: '+1'
In [115]: "{:+}".format(-1)
Out[115]: '-1'
千分位分隔符 [grouping_option]
只支持,和_分隔
In [145]: "{:,}".format(10000)
Out[145]: '10,000'
In [146]: "{:_}".format(10000)
Out[146]: '10_000'
浮点数保留小数点位数 [.precision]
In [151]: "{:.3f}".format(1.2)
Out[151]: '1.200'
In [152]: "{:.3f}".format(1.2123)
Out[152]: '1.212'
格式化输出字符的类型 [#][0][type]
- 整数类型 "b" | "c" | "d" | "o" | "x" | "X" | 'n', 默认值"d"
进制
In [161]: "{:b}".format(1000) # 二进制
Out[161]: '1111101000'
In [162]: "{:o}".format(1000) # 八进制
Out[162]: '1750'
In [163]: "{:d}".format(1000) # 十进制
Out[163]: '1000'
In [164]: "{:x}".format(1000) # 十六进制小写
Out[164]: '3e8'
In [165]: "{:X}".format(1000) # 十六进制大写
Out[165]: '3E8'
显示进制的符号
In [161]: "{:#0b}".format(1000) # 二进制
Out[161]: '0b1111101000'
In [162]: "{:#0o}".format(1000) # 八进制
Out[162]: '0o1750'
In [164]: "{:#0}".format(1000) # 十六进制小写
Out[164]: '0x3e8'
In [165]: "{:#0X}".format(1000) # 十六进制大写
Out[165]: '0X3E8'
按照ascii码将数字转化成字符
In [177]: "{:c}".format(65)
Out[177]: 'A'
In [178]: "{:n}".format(65)
Out[178]: '65'
"n" 和 "d"的区别
In [171]: "{:,d}".format(1000)
Out[171]: '1,000'
In [172]: "{:,n}".format(1000)
ValueError: Cannot specify ',' with 'n'.
- 浮点数类型 "e" | "E" | "f" | "F" | "n" | "%" 默认的小数位数是6
import math
In [224]: "{:e}".format(666666.46) # 科学计数法小写
Out[224]: '6.666665e+05'
In [225]: "{:E}".format(666666.56) # 科学计数法大写
Out[225]: '6.666666E+05'
In [226]: "{:f}".format(666666.44)
Out[226]: '666666.440000'
In [234]: "{:f}".format(math.nan)
Out[234]: 'nan'
In [235]: "{:F}".format(math.nan)
Out[235]: 'NAN'
In [236]: "{:%}".format(666666.66)
Out[236]: '66666666.000000%'
转义{ 和 }
如果希望得到字符{或者}可以使用{{或}}进行转义
比如要表示一个json时
In [53]: '{{"a": 1, "b": {}}}'.format(2)
Out[53]: '{"a": 1, "b": 2}'