格式化字符串时,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 "" , line 1, in
'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 "" , line 1, in
'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 "" , line 1, in
'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 |
|
format_spec |
|
在不那么正式的术语,置换领域可以开始与指定的对象,其值是要进行格式化并插入到的输出而不是替换字段的字段名。字段名(可选) 其次是转换领域,前面有一个感叹号’!’,和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字符串被解释。这将允许动态地指定的值的格式。
请参阅格式示例部分的一些例子。
“格式说明符”位于格式字符串的被置换区域中,用于定义每一个值如何显示 (请参见格式字符串语法)。它们也可以直接传递给内置的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 ()函数。
不同的对方方式选项的含义如下所示
选项 | 代表意义 |
---|---|
‘<’ | 如果有足够的空间,左对齐 |
‘>’ | 如果有足够的空间,右对齐 |
‘=’ | |
‘^’ | 如果有足够的空间,居中 |
如查没有定义最小字段宽度,则字段宽度总是等于数据的宽度,在这种情况下对齐选项就没有意义了
符号选项只适用于有效的数字类型
选项 | 代表意义 |
---|---|
‘+’ | 数字的正负号都显示出来 |
‘-‘ | 正数的符号不显示,负数的符号显示出来 |
’ ‘ | 正数前面加一个空格,负数的符号显示出来 |
只适用于二进制,八进制,十六进制整。
如果#号存在指定输入前缀为0b
,0o
,0x
只适用于整数,将整数以千数位以,
分割
定义最小字段宽度。如果未指定,那么将由内容决定字段宽度
只适用于整数,如果有足够的空间使用0填充
小数点的位数,只适用于浮点数
适用于字符串的格式有
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