python 中的字符串格式化可以以两种方式实现
- 字符串格式化表达式 :
'...%s...' % (values)这是从Python诞生的时候就有的技术,这一形式是基于C语言的"printf"模型,并且在大多数现有的代码中广泛使用. - 字符串格式化方法调用:
'...{}...'.format(values)这是Python2.6和Python3.0新增加的技术,这一形式部分地起源于C#/.NET中同名工具,并且和字符串格式化表达式的功能有很大重叠.
字符串格式化表达式
-
字符串格式化表达式基本定义
- 基本语法:
'...%s...' % (values) - 基本用法:
- 在
%运算符左侧放置一个需要进行格式化的字符串,这个字符串带有一个或多个内嵌的转换目标,都以%开头(如%d) - 在
%运算符右侧放置一个(或多个,内嵌在元组中的)对象,这些对象将会插入到左侧字符串中,并替换一个(或多个)转换目标.
- 在
- 简单示例:
1 2>>> 'That is %d %s bird!' % (1, 'dead') 'That is 1 dead bird!'
该示例中, 运算符
%左侧字符串'That is %d %s bird!'中的%d被右侧整数型常量1替换,%s被右侧字符串常量'dead'替换,替换后的字符串为'That is 1 dead bird!' - 基本语法:
-
高级格式化表达式: 在
%运算符左侧字符串中的替换目标以%字符为开头后跟类型码来定义替换的数据类型,如%d用于十进制数字,%s用于字符串等,python所支持的字符串格式化类型码下表所示:代码 定义 s 字符串(或任何对象的 str(x)字符串)r 与 s相同,使用repr,而不是strc 字符( int或str)d 十进制数字(以 10为底的整数)i 整数 u 与 d相同(已废弃,不在是无符号整数)o 八进制整数(以 8为底)x 十六进制整数(以 16为底)X 与 x相同,但使用大写字母e 带有指数的浮点数,小写 E 与 e相同,但使用大写字母f 十进制浮点数 F 与 f相同,但使用大写字母g 浮点数 e或fG 浮点数 E或F% 字面量(编码为 %%)字符格式化代码格式:
%[(keyname)][flags][width][.precision]typecode%定义开始(keyname)为索引在表达式右侧使用的字典提供键名称(用于基于字典的格式化表达式中)[flags]罗列出说明格式的标签,如左对齐(-),数值符号(+),整数前的空白以及负数前的-(空格)和补充(0)[width]为被替换的文本给出总的最小字段宽度[.precision]为浮点数设置小数点后显示的位数(精度)typecode
[width]和[.precision]部分都可编写为一个*,以指定它们应该从表达式右侧的输入值中的下一项取值(当运行时才会得知这两参数,很有用) -
示例
- 简单替换
1 2 3>>> x = 1234 >>> 'integers: ...%d...%-6d...%06d' % (x, x, x) 'integers: ...1234...1234 ...001234'%d默认格式化,%-6d最小宽度为6位字符的左对齐格式化,%06d6位字符补零格式化- 基于字典的格式化表达式
1 2>>> '%(qty)d more %(food)s' % {'qty': 1, 'food': 'spam'} '1 more spam'
字符串格式化方法调用
-
字符串格式化方法基础
-
定义
Python2.6、2.7 和 3.x 中可用的字符串对象的
format方法,是基于正常的函数调用语法,而不是表达式语法。特别的它使用主体字符串作为模板,并接受任意多个参数,用来表示将要根据模板替换的值。它的使用要求具备函数和调用的知识、但其使用多半是清晰易懂的。在主体字符串中,花括号的位置 (如 {1})、关键字 (如 {food}),或 Python 2.7、3.1 以及以后版本中的相对位置 ({})来指定替换目标及将要插入的参数。
-
示例
# By position
1 2 3>>> template = '{0}, {1} and {2}' >>> template.format('spam', 'ham', 'eggs') 'spam, ham and eggs'# By keyword
1 2 3>>> template = '{motto}, {pork} and {food}' >>> template.format(motto='spam', pork='ham', food='eggs') 'spam, ham and eggs'
-
-
高级格式化方法语法
另一种和
%表达方式类似的是,可在格式化字符串中添加额外的语法来实现更具体的层级。对于格式化方法,我们可能为空的替换目标的识别码之后使用一个冒号,后面跟着可以指定的字段大小,对齐方式和特定类型编码的格式说明符。
语法:
{fieldname component !conversionflag :formatspec}-
fieldname是辨识参数的一个可选的数字或关键字 -
component是有着大于等于零个.name或[index]引用字符串,它可以被省略以使用完整的参数值。其中的引用用来获取参数的属性或索引值。 -
conversionflag如果出现则以!开始,后面跟着r、s或者a, 在这个值上分别调用repr、str或ascii内置函数. -
formatspec如果出现则以:开始,后面跟着文本,指定了如何表示该值,包括字段宽、对其方式、补零、小数精度等细节,并且以一个可选的数据类型码结束。格式:
[[fill]align][sign][#][0][width][,][.precision][typecode]fill可以是除{或}之外的任意字符填充align可以是<、>、=或^, 分别表示 左对齐、右对齐、符号字符后的填充,或居中对齐。sign可以是+、-或空格width、precision和typecode与%表达式中时一样
示例
# 字段宽度
1 2>>> '{0:10} = {1:10}'.format('spam', 123.4567) 'spam = 123.4567'# 对齐方式
1 2>>> '{0:>10} = {1:<10}'.format('spam', 123.4567) ' spam = 123.4567 '# 参数索引
1 2 3>>> import sys >>> '{0.platform:>10} = {1[kind]:<10}'.format(sys, dict(kind='laptop')) ' linux = laptop ' -