Python 旧式 printf 风格字符串格式化使用说明

我被代码海扁署名-非商业-禁演绎
阅读 7:36·字数 2285·发布 
Bilibili 空间
关注 960

由于使用 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 stringTypeError: 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(八进制),0x0X(十六进制),或者强制为浮点数显示小数点。

width 值

width表示转换符占用的最小空间(长度),如果忽略他,则转换符的空间由其对应的值来决定。如果width被设置为*,那么values需要是一个 Python 元组,且元组接下来的元素表示转换符占用的最小空间,而不是转换符对应的值。

precision 值

precision表示转换符的精度(数字超出精度时将被舍入),当typefFeE时,精度是指小数点后的位数(将自动补0)。当typegG时,精度是指小数点前后的所有位数(不会自动补0)。如果转换符对应的值是 Python 字符串,那么字符串的长度会被精度限制。如果precision被设置为*,那么values需要是一个 Python 元组,且元组接下来的元素表示转换符的精度,而不是转换符对应的值。

type 值

type用于设置数字或字符串的具体呈现方式。

length 值

length可以被设置为hlL,但不会产生任何实际效果。

'%+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,则精度默认为6Ee类似,但会采用大写字母。

f表示将数字显示为定点数,此时转换符中的precision表示小数点后的位数,如果未指定precision,则精度默认为6Ff类似,但会采用大写字母。

g表示根据转换符中的precision(精度为0会被视为1)和数字的值来选择是否使用科学计数法显示数字,数字末尾无意义的0和小数点会被省略(除非使用#),如果未指定precision,则精度默认为6Gg类似,但会采用大写字母。

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 字符串,还可以格式化 Pythonbytesbytearray对象表示的字节串,他们仅在转换符的type的取值中存在一些差异,具体如下。

b(等价于已弃用的s)表示将values提供的值转换为字节串,该值需要是一个 Pythonbytesbytearray对象,或遵守缓冲协议的对象,或拥有__bytes__方法的对象。

ar表示将使用表达式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表示的格式化。

custom.py
# 一个用于格式化的类
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