Python 旧式 printf 风格字符串格式化使用说明
由于使用 Python 旧式 printf 风格进行字符串格式化可能导致一些问题,因此,建议使用str
类型的format
方法,你可以查看如何格式化 Python 字符串?format,format_map 方法,Formatter 类介绍一节来了解更多信息。
Python 旧式 printf 风格字符串格式化
Python 旧式的 printf 风格字符串格式化,可以完成与 Pythonstr
类型的format
方法类似的效果,其语法格式如下。
format % values
- format 值
format
是需要进行格式化的 Python 字符串,字符串中包含若干以%
开头的转换符,这些转换符将被values
提供的值代替。- values 值
values
是一个 Python 元组或字典对象,元组中的元素或字典中的键值对将代替 Python 字符串中的转换符。如果在format
对应的字符串中,仅包含一个转换符,那么values
可以是其他类型的对象。如果
values
是 Python 元组,那么该元组中的元素将依次替换字符串中的转换符,此时元组所包含的元素的个数需要与字符串中的转换符的个数相同,否则会引发异常TypeError: not enough arguments for format string
或TypeError: not all arguments converted during string formatting
。如果values
是 Python 字典,那么该字典所包含的键值对应能够替换字符串中所有的转换符,否则将引发异常KeyError
。
'%f %s' % (1.23, 4.56)
'1.230000 4.56'
'%(name)s %(age)d' % {'name': 'Jack', 'age': 12, 'passed': True}
'Jack 12'
'%f' % 123
'123.000000'
Python 旧式 printf 风格字符串格式化中的转换符
在使用 Python 旧式 printf 风格对字符串进行格式化时,以%
开头的转换符将被替换为其他内容,转换符的格式如下。
%[(key)][sign][width][.precision]type[length]
- key 值
当
values
是一个 Python 字典时,key
为字典某个键值对的键,该键值对的值将替换转换符。- sign 值
如果
sign
包含0
,那么在拥有剩余空间的情况下,将自动为数字添加字符0
。如果sign
包含-
(-
会使0
失效),那么将在可用的空间内进行左对齐。如果sign
包含sign
为+
(-
会使+
或负号-
。如果sign
包含#
,那么将为整数显示相关前缀,比如0o
(八进制),0x
或0X
(十六进制),或者强制为浮点数显示小数点。- width 值
width
表示转换符占用的最小空间(长度),如果忽略他,则转换符的空间由其对应的值来决定。如果width
被设置为*
,那么values
需要是一个 Python 元组,且元组接下来的元素表示转换符占用的最小空间,而不是转换符对应的值。- precision 值
precision
表示转换符的精度(数字超出精度时将被舍入),当type
为f
,F
,e
或E
时,精度是指小数点后的位数(将自动补0
)。当type
为g
,G
时,精度是指小数点前后的所有位数(不会自动补0
)。如果转换符对应的值是 Python 字符串,那么字符串的长度会被精度限制。如果precision
被设置为*
,那么values
需要是一个 Python 元组,且元组接下来的元素表示转换符的精度,而不是转换符对应的值。- type 值
type
用于设置数字或字符串的具体呈现方式。- length 值
length
可以被设置为h
,l
或L
,但不会产生任何实际效果。
'%+010d' % 1
'+000000001'
'%-010g' % 1.2
'1.2 '
'%(num)+#x' % {'num': 12}
'+0xc'
'%(num) #o' % {'num': 12}
' 0o14'
'%*d' % (5, 1234)
' 1234'
'%*f' % (5, 1234.56789)
'1234.567890'
'%.5e' % 1.23456789
'1.23457e+00'
'%.5g' % 1.23456789
'1.2346'
'%.*f' % (5, 1.23456789)
'1.23457'
使用 Python 旧式 printf 风格为数字和字符串设置具体呈现方式
在使用 Python 旧式 printf 风格对字符串进行格式化时,通过指定转换符中的type
,可以为转换符对应的数字或字符串设置具体的呈现方式,其具体的取值如下。
d
(等价于已弃用的u
),i
表示将数字显示为十进制格式,o
表示将数字显示为八进制格式,x
表示将数字显示为十六进制格式,其中字母为小写,X
同样表示将数字显示为十六进制格式,但字母为大写。
e
表示将数字显示为科学计数法,此时转换符中的precision
表示小数点后的位数,如果未指定precision
,则精度默认为6
。E
与e
类似,但会采用大写字母。
f
表示将数字显示为定点数,此时转换符中的precision
表示小数点后的位数,如果未指定precision
,则精度默认为6
。F
与f
类似,但会采用大写字母。
g
表示根据转换符中的precision
(精度为0
会被视为1
)和数字的值来选择是否使用科学计数法显示数字,数字末尾无意义的0
和小数点会被省略(除非使用#
),如果未指定precision
,则精度默认为6
。G
与g
类似,但会采用大写字母。
c
表示将数字转换为对应的 Unicode 字符。
%
表示将转换符显示为%
自身,而不是替换为某个值。
s
表示会调用 Python 的str
的构造器(构造函数)来格式化转换符对应的值,r
会调用 Python 的repr
函数,a
会调用 Python 的ascii
函数。
'%d' % 123.456
'123'
'%e' % 1.2345678
'1.234568e+00'
'%.3f' % 1.2345678
'1.235'
'%.0g' % 12345678.9
'1e+07'
'%.3g' % 12345678.9
'1.23e+07'
'%.10g' % 12.0000000001
'12'
'%#.10g' % 12.0000000001
'12.00000000'
'%c' % 65
'A'
'%d%%' % 10
'10%'
使用 Python 旧式 printf 风格格式化 bytes 或 bytearray 对象表示的字节串
Python 旧式 printf 风格,除了可以格式化 Python 字符串,还可以格式化 Pythonbytes
或bytearray
对象表示的字节串,他们仅在转换符的type
的取值中存在一些差异,具体如下。
b
(等价于已弃用的s
)表示将values
提供的值转换为字节串,该值需要是一个 Pythonbytes
或bytearray
对象,或遵守缓冲协议的对象,或拥有__bytes__
方法的对象。
a
或r
表示将使用表达式repr(obj).encode('ascii','backslashreplace')
来转换values
提供的值。
b'%b' % bytearray(b'Jack')
b'Jack'
b'%b' % b'Jack'
b'Jack'
b'%a' % 'Jack,你好'
b"'Jack\\uff0c\\u4f60\\u597d'"
bytearray(b'%a') % b'Jack'
bytearray(b"b\'Jack\'")
在下面的示例中,我们定义了一个用于格式化的 Python 类Data
,该类定义了方法__bytes__
,使其可用于%b
表示的格式化。
# 一个用于格式化的类
class Data:
# 定义了 __bytes__ 方法
def __bytes__(self):
return bytes(b'__bytes__')
print(b'%b' % Data())
b'__bytes__'
源码
src/zh/data_types/text_types/printf·codebeatme/python·GitHub