python字符串格式化

时间:2022-01-24 11:01:10

写的不好,学习字符串格式化时候的记录笔记,待日后完善(有一些用法还不熟练)

旧式格式化


模板

格式化字符串时,Python使用一个字符串作为模板 ,模板中有格式符,这些格式符为真实值预留位置,并说时真实数值应该呈现的模式,Python用一个tuple 将多个值传递给模板,每个值对应一个格式符。

'name:%s, age:%d' % ('jianglei', 18)
>>>'name:jianglei, age:18'

在上面的例子中,'name:%s, age:%d' 作为模板,%s 为第一个格式符代表字符串, %d 为第二个格式符代表十进制整数。('jianglei', 18)元组作为实际传入的参数。‘jianglei’ 对应%s 18对应 %d,模板和参数之间有一个%号代表格式化操作
整个语句实际上是一个字符串表达示,可以像普通的字符串一样赋值给变量

>>> str = 'name:%s, age:%d' % ('jianglei', 18)
>>> str
'name:jianglei, age:18'
>>>

元组中的参数必须与格式符的数量相一致要不会报错

>>> 'name:%s, age:%d' % ('jianglei')

Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
'name:%s, age:%d' % ('jianglei')
TypeError: not enough arguments for format string

>>> 'name:%s, age:%d' % ('jianglei', 18, "a")

Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
'name:%s, age:%d' % ('jianglei', 18, "a")
TypeError: not all arguments converted during string formatting

格式符与参数的类型不一致也会报错

>>> 'name:%s, age:%d' % ('jianglei', "1")

Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
'name:%s, age:%d' % ('jianglei', "1")
TypeError: %d format: a number is required, not str

我们也可以用字典来传递真实值

>>> 'name: %(name)s, age:%(age)d' % {'name':'jianglei', 'age':18}
'name: jianglei, age:18'

格式符

格式符 含义
%s str()的显示
%r repr()的显示
%c 单个字符
%d, %i 十进制整数
%b 二进制整数
%o 八进制整数
%h 十六进制整数
%e 科学计数法 基底为e
%E 科学计数法 基底为E
%f 浮点数
%F 同上,浮点数
%g 科学计数法 或 浮点数(根据显示的长度决定)
%G 同上

可以用如下的方式,对格式进行进一步的控制
%[(name)][flag][width].[precision]typecode
flag可以为+, -, '', 0
+表示右对齐
-表示左对齐
’ ‘空格表示为正数空一个格出来
0表示0填充

width 表示宽度
precision 表示小数点后的精度

width和precision可以用星号来表示,在后面的元组中传入
>>> '%0*.*f' % (10,4,213.1)
'00213.1000'

新式字符串格式化

Str.format()方法和格式化程序类共享相同的格式字符串语法(尽管在格式化程序,子类可以定义自己的格式字符串语法)
格式化字符串为花括号{}包围的替换字段。所有括号外的内容均被视为文本,不做改变复制到输出。如果您需要在文本中包括花括号字符,它可以通过双花括号字符来进行转义:{{}}
替换的语法如下:

字段 语法
replacement_field "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name arg_name ("." attribute_name | "["element_index "]" )*
arg_name [identifier | integer]
attribute_name identifier
element_index integer | index_string
index_string <any source character except "]">+
format_spec <described in the next section>

在不那么正式的术语,置换领域可以开始与指定的对象,其值是要进行格式化并插入到的输出而不是替换字段的字段名。字段名(可选) 其次是转换领域,前面有一个感叹号’!’,和format_spec,这前面有一个冒号’:’。这些指定非默认格式的重置价值。

另请参阅格式描述迷你语言节。

字段名本身始于arg_name ,是数字或关键字。如果它是一个数字,它是指一个位置的参数,而如果它是一个关键字,它指命名的关键字参数。如果在格式字符串中的数值 arg_names 是 0,1,2,……在序列中,它们可以全部省略 (不只是一些) 和数字 0,1,2,……将自动插入顺序。因为arg_name不是引号分隔的它不是可以指定任意字典键 (例如,字符串’10’或’:-]’) 在格式字符串中。Arg_name的后面可以由任意数量的索引或属性的表达式。表达式形式.name选择使用getattr(),而窗体’[索引]’的表达式并使用getitem()索引查找的命名的属性。
2.7 版本中的更改:定位参数说明符,则可以省略,所以’{} {}’相当于’ {0} {1}’。
一些简单的格式字符串的示例:

"First, thou shalt count to {0}" # References first positional argument
"Bring me a {}" # Implicitly references the first positional argument
"From {} to {}" # Same as "From {0} to {1}"
"My quest is {name}" # References keyword argument 'name'
"Weight in tons {0.weight}" # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}" # First element of keyword argument 'players'.

转换场导致前格式类型强制。通常情况下,值进行格式设置的作业是由值本身的format()方法完成的。然而,在某些情况下是需要强制类型将被格式化为字符串,重写其自己定义的格式。通过在调用format()之前,将值转换为一个字符串,绕过正常的格式化逻辑。

目前支持两种转换标志: ‘! s’值,调用str()和’ ! r’调用repr()。
Format_spec字段包含格式如何表现的说明,包括这些细节作为字段宽度、对齐、 填充、 小数精度等方面的规范。每个值类型可以定义它自己的”格式设置迷你语言”或format_spec的解释。

大多数内置类型支持一种共同的格式设置迷你语言下, 一节所述。

Format_spec字段还可以包含嵌套的替代字段内。这些嵌套的替换字段可以包含唯一字段的名称 ;不允许转换标志和格式规范。在 format_spec 内的替换字段替换之前的format_spec字符串被解释。这将允许动态地指定的值的格式。

请参阅格式示例部分的一些例子。

格式说明符Mini-Language

“格式说明符”位于格式字符串的被置换区域中,用于定义每一个值如何显示 (请参见格式字符串语法)。它们也可以直接传递给内置的format ()函数。每个 formattable 的类型都可以定义格式描述如何被解释。

大多数内置类型都实现了以下的格式描述选项中,虽然一些格式选项只支持数值类型。
标准格式说明符的一般形式为:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= integer
precision ::= integer
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

如果指定了一个无效的对齐值,它可以以可以是任何字符和空间,如果省略默认填充字符开头。请注意它不可能会同时使用str.format()方法 ; 作为填充字符使用{和} 但是这种限制并不影响format ()函数。

align

不同的对方方式选项的含义如下所示

选项 代表意义
‘<’ 如果有足够的空间,左对齐
‘>’ 如果有足够的空间,右对齐
‘=’
‘^’ 如果有足够的空间,居中

如查没有定义最小字段宽度,则字段宽度总是等于数据的宽度,在这种情况下对齐选项就没有意义了

sign

符号选项只适用于有效的数字类型

选项 代表意义
‘+’ 数字的正负号都显示出来
‘-‘ 正数的符号不显示,负数的符号显示出来
’ ‘ 正数前面加一个空格,负数的符号显示出来

#

只适用于二进制,八进制,十六进制整。
如果#号存在指定输入前缀为0b,0o,0x

,

只适用于整数,将整数以千数位以,分割

width

定义最小字段宽度。如果未指定,那么将由内容决定字段宽度

0

只适用于整数,如果有足够的空间使用0填充

精度

小数点的位数,只适用于浮点数

type

适用于字符串的格式有

type 代表意义
’s’ 字符串,可以省略

适用于整数的跟上面的旧式字符串一样

模板字符串格式化

class string.Template(template)


substitute(mapping[, **kws])
#对模板进行替换,返回一个新的字符串
#mapping 可以是任何的类字典对象,对象里的key与要模板里要替换的标识符相匹配
#你也可以提供关键字参数
#如果mapping 和 kws都提供了,还有重复,kws里的优先级比较高

safe_substitute(mapping[, ** kws])
#像`substitute()`,除了在mapping,和kws里没有缺少要替换的参数时,他不会引发一个`KeyError`异常。原始的标识符会保留在返回的结果里,不像substitute(),别的$,仅会返回$,而不是引发ValueError异常
#然而别的异常可能会发生,这个方法叫“safe"加为替换操作总是试着返回一个可用的字符串而不是引发一个异常。别一种理解,safe_substitue()无限接进安全的,因为他会安静的忽略不正确的模板

template(模板,参数传入的)

模板提供了简单的字符串替换,模板不用%作为标识符,模板提供了$作为标识符起点,遵守下面的规则

  • $$是转义字符,他会被替换成一个$
  • 标识符要与后面提供的参数相对应,标识符后至少要有一个空格 如$name is a boy $age
  • ${identifier}$identifier是等价的,但是他在标识符与单词紧紧连接的时候有用如${noun}ification

在出现了除上述规则外的$ 会引发ValueError