python使用format函数进行格式化

str.format( )用于字符串的格式化,本文的大部分内容都参考自官网。

一、format函数的基本格式

我们常见的format用法入下:

>>> name='Schiller'
>>> print("my name is {}".format(name))
my name is Schiller

上面的示例中,格式字符串中以花括号 {} 括起来的是“替换字段”,其他的是字面文本,直接输出。因为format函数功能比较多,所以提前列出“替换字段”的基本格式,如果暂时看不懂,可先查看后面的示例。

格式如下:

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"
  • “field_name”用于指定需要替换的字符,format函数的参数可以是类对象、字典和列表,需要不同的定位方式。以一个数字或关键字 arg_name 打头,如果为数字,则它指向一个位置参数,而如果为关键字,则它指向一个命名关键字参数;
  • “conversion”字段在格式化之前进行类型强制转换,目前支持的转换旗标有三种: ‘!s’ 会对值调用 str(),’!r’ 调用 repr() 而 ‘!a’ 则调用 ascii();
  • format_spec 字段包含值应如何呈现的规格描述,例如字段宽度、对齐、填充、小数精度等细节信息。

conversion示例:

>>> '{0!r}'.format('完美')
"'完美'"
>>> '{0!a}'.format('完美')
"'\\u5b8c\\u7f8e'"

在格式化完美之前先调用repr(‘完美’)和ascii(‘完美’)

format_spec的一般格式如下:

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" | "%"
  • fill:指定填充的字符,默认是空格;
  • align:指定对齐方式;
  • sign:控制正负号;
  • width:指定最小总字段宽度;
  • grouping_option:指定分隔符
  • precision:指定浮点数的精度;
  • type:指定数据的呈现方式;

字符串表示类型:

选项意义
‘s’字符串格式。这是字符串的默认类型,可以省略
None和 ‘s’ 一样

整数部分随“进制转换”示例给出。

浮点数和小数值可用的表示类型有:

选项意义
’ e ’指数表示, 以使用字母 ‘e’ 来标示指数的科学计数法打印数字, 默认的精度为 6
’ E ’指数表示, 与 ‘e’ 相似,不同之处在于它使用大写字母 ‘E’ 作为分隔字符
’ f ’定点表示,将数字显示为一个定点数,默认的精确度为 6
’ F ’定点表示,与 ‘f’ 相似,但会将 nan 转为 NAN 并将 inf 转为 INF
’ g ’常规格式。 对于给定的精度 p >= 1,这会将数值舍入到 p 位有效数字,再将结果以定点格式或科学计数法进行格式化,具体取决于其值的大小。准确的规则如下:假设使用表示类型 ‘e’ 和精度 p-1 进行格式化的结果具有指数值 exp。 那么如果 m <= exp < p,其中 m 以 -4 表示浮点值而以 -6 表示 Decimal 值,该数字将使用类型 ‘f’ 和精度 p-1-exp 进行格式化。 否则的话,该数字将使用表示类型 ‘e’ 和精度 p-1 进行格式化。 在两种情况下,都会从有效数字中移除无意义的末尾零,如果小数点之后没有余下数字则小数点也会被移除,除非使用了 ‘#’ 选项。正负无穷,正负零和 nan 会分别被格式化为 inf, -inf, 0, -0 和 nan,无论精度如何设定。精度 0 会被视为等同于精度 1。 默认精度为 6
’ G ’常规格式。 类似于 ‘g’,不同之处在于当数值非常大时会切换为 ‘E’。 无穷与 NaN 也会表示为大写形式
‘%’百分比。 将数字乘以 100 并显示为定点 (‘f’) 格式,后面带一个百分号
None类似于 ‘g’,不同之处在于当使用定点表示法时,小数点后将至少显示一位。 默认精度与表示给定值所需的精度一样。 整体效果为与其他格式修饰符所调整的 str() 输出保持一致

注:
nan:Not A Number(不是一个数),它并不等于0;
inf:表示无穷,float(“inf”)是正无穷,float("-inf")是负无穷;

其他部分参数具体的值和对应的意义后面会随示例一起给出。

二、format示例

1、访问参数

按位置访问参数

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')
'a, b, c'
>>> '{2}, {1}, {0}'.format(*'abc') 
'c, b, a'
#参数的索引可以重复
>>> '{2}, {1}, {0}, {0}'.format('a', 'b', 'c')
'c, b, a, a'

按名称访问参数

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'

访问参数的属性

>>> c=3-5j
>>> 'The complex number {0} is formed from the real part {0.real} and the imaginary part {0.imag}'.format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0'
>>> class Point:
...     def __init__(self,x,y):
...         self.x,self.y=x,y
...     def __str__(self):
...         return "Point({self.x}, {self.y})".format(self=self)
... 
#c=Point(4,2)
#print("Point({0.x}, {0.y})".format(c))
#上面两行代码效果一样
>>> str(Point(4,2))
'Point(4, 2)'

访问参数的项

>>> name=['Schiller','Xu']
>>> "name is {0[0]} {0[1]}".format(name)
'name is Schiller Xu'

2、对齐文本及指定宽度

对齐方式如下:

选项意义
‘<’强制字段在可用空间内左对齐(这是大多数对象的默认值
‘>’强制字段在可用空间内右对齐(这是数字的默认值)
‘=’强制将填充放置在符号(如果有)之后但在数字之前。这用于以“+000000120”形式打印字段。此对齐选项仅对数字类型有效。当’0’紧接在字段宽度之前时,它成为默认值。
‘^’强制字段在可用空间内居中

除非定义了最小字段宽度,否则字段宽度将始终与填充它的数据大小相同,因此在这种情况下,对齐选项没有意义。

示例:

>>> '{:<30}'.format('test')
'test                          '
>>> '{:>30}'.format('test')
'                          test'
>>> '{:^30}'.format('test')
'             test             '
#用'*'进行填充
>>> '{:*^30}'.format('test')
'*************test*************'
>>> '{:=10}'.format(-3.1415)
'-   3.1415'
>>> '{:0=10}'.format(-3.1415)
'-0003.1415'

3、指定正负号

sign只对数字类型有效,取值如下:

选项意义
‘+’表示标志应该用于正数和负数
‘-’表示标志应仅用于负数(这是默认行为)
Space表示应在正数上使用前导空格,在负数上使用减号

示例:

>>> '{:+} {:+}'.format(+3.14,-3.14)
'+3.14 -3.14'
#默认是‘-’
>>> '{:-} {:}'.format(+3.14,-3.14)
'3.14 -3.14'
>>> '{: } {: }'.format(+3.14,-3.14)
' 3.14 -3.14'

4、进制转换

整数进制如下:

选项意义
‘b’二进制格式,输出以 2 为基数的数字
‘c’字符,在打印之前将整数转换为相应的unicode字符
‘d’十进制整数,输出以 10 为基数的数字
‘o’八进制格式,输出以 8 为基数的数字
‘x’十六进制格式,输出以 16 为基数的数字,使用小写字母表示 9 以上的数码
‘X’十六进制格式,输出以 16 为基数的数字,使用大写字母表示 9 以上的数码
None和 ‘d’ 相同

示例:

>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
>>> "float: {0:#f}".format(42)
'float: 42.000000'

'#'仅对整数、浮点、复数和 Decimal 类型有效。 对于整数类型,当使用二进制、八进制或十六进制输出时,此选项会为输出值添加相应的 ‘0b’, ‘0o’ 或 ‘0x’ 前缀。 对于浮点数、复数和 Decimal 类型,替代形式会使得转换结果总是包含小数点符号,即使其不带小数。 通常只有在带有小数的情况下,此类转换的结果中才会出现小数点符号。 此外,对于 ‘g’ 和 ‘G’ 转换,末尾的零不会从结果中被移除。

5、千位分隔符

可以使用“,”或者“_”作为千位分隔符。

>>> "{:,}".format(1234567890)
'1,234,567,890'
>>> "{:_}".format(1234567890)
'1_234_567_890'

6、表示百分数

>>> total=22
>>> infected=19
>>> print("Infected people make up {:.2%} of the total population".format(infected/total))
Infected people make up 86.36% of the total population

7、日期格式化

>>> import datetime
>>> d = datetime.datetime(2020, 3, 31, 12, 45, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2020-03-31 12:45:58'

三、参考资料

格式字符串语法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值