python字符串格式化深入详解(四种方法)

机器学习与python集中营

共 5855字,需浏览 12分钟

 · 2020-12-11

前言:本文详细整理了python字符串格式化的几种方式。

一、使用 % 符号来进行格式化

格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下:

%s    字符串 (采用str()的显示)

%r    字符串 (采用repr()的显示)

%c    单个字符

%b    二进制整数

%d    十进制整数

%i    十进制整数

%o    八进制整数

%x    十六进制整数

%e    指数 (基底写为e)

%E    指数 (基底写为E)

%f    浮点数

%F    浮点数,与上相同

%g    指数(e)或浮点数 (根据显示长度)

%G    指数(E)或浮点数 (根据显示长度)

%%    字符"%",显示百分号%

另外,比如我要固定字符的宽度,小数精度等,可以用如下的方式,对格式进行进一步的控制:

%[(name)][flags][width].[precision] typecode

(1)(name)为命名:即参数的名称,可以没有这个,怎么使用呢?注意(name需要使用括号括起来哦!!!)

# 注意:这里的name,num括号不能掉
'Hey %(name)s, there is a %(num)f number!' % {"name": name, "num": number }


(2)flags可以有+,-,' '或0。+表示右对齐。-表示左对齐。' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示左侧使用0填充。

(3)width表示显示宽度

(4)precision表示小数点后精度

 

注意:百分号% 来格式化字符串是最早出现的,python里面称之为printf风格的字符串格式化,参考官方文档:

https://docs.python.org/zh-cn/3.7/library/stdtypes.html#old-string-formatting

 

二、使用.format的格式

字符串类型格式化采用format()方法,基本使用格式是:

     <模板字符串>.format(<逗号分隔的参数>)

2. 1 格式控制信息

format()方法中<模板字符串>的槽除了包括参数序号,还可以包括格式控制信息。此时,槽的内部样式如下:

{<参数序号>: <格式控制标记>}   # 中间使用了一个冒号哦!

其中,<格式控制标记>用来控制参数显示时的格式,包括:<填充><对齐><宽度><,><.精度><类型>6 个字段,这些字段都是可选的,可以组合使用,逐一介绍如下。

(1)<填充>
指<宽度>内除了参数外的字符采用什么方式表示,默认采用空格,可以通过<填充>更换。

(2)<对齐>
指参数在<宽度>内输出时的对齐方式,分别使用<、>和^三个符号表示左对齐、右对齐和居中对齐。

(3)<宽度>
指当前槽的设定输出字符宽度,如果该槽对应的format()参数长度比<宽度>设定值大,则使用参数实际长度。如果该值的实际位数小于指定宽度,则位数将被默认以空格字符补充。

s = "PYTHON"

"{0:30}".format(s)
Out[17]: 'PYTHON                        '

"{0:>30}".format(s)
Out[18]: '                        PYTHON'

"{0:*^30}".format(s)
Out[19]: '************PYTHON************'

"{0:-^30}".format(s)
Out[20]: '------------PYTHON------------'

"{0:3}".format(s)
Out[21]: 'PYTHON'

(4)逗号(,)
<格式控制标记>中逗号(,)用于显示数字的千位分隔符,例如:

"{0:-^20,}".format(1234567890)
Out[24]: '---1,234,567,890----'

"{0:-^20}".format(1234567890#对比输出
Out[25]: '-----1234567890-----'

"{0:-^20,}".format(12345.67890)
Out[26]: '----12,345.6789-----'


 (5)<.精度>   # 注意:前面有一个小数点哦!
表示两个含义,由小数点(.)开头。对于浮点数,精度表示小数部分输出的有效位数。对于字符串,精度表示输出的最大长度。

"{0:.2f}".format(12345.67890)
Out[29]: '12345.68'

"{0:H^20.3f}".format(12345.67890)
Out[30]: 'HHHHH12345.679HHHHHH'

"{0:.4}".format("PYTHON")
Out[31]: 'PYTH'

(6)<类型>
表示输出整数和浮点数类型的格式规则。对于整数类型,输出格式包括6 种:

b: 输出整数的二进制方式;
c: 输出整数对应的 Unicode 字符;
d: 输出整数的十进制方式;
o: 输出整数的八进制方式;
x: 输出整数的小写十六进制方式;
X: 输出整数的大写十六进制方式;

"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(425)
Out[32]: '110101001,Ʃ,425,651,1a9,1A9'

对于浮点数类型,输出格式包括4 种:
e: 输出浮点数对应的小写字母 e 的指数形式;
E: 输出浮点数对应的大写字母 E 的指数形式;
f: 输出浮点数的标准浮点形式;
%: 输出浮点数的百分形式。
     浮点数输出时尽量使用<.精度>表示小数部分的宽度,有助于更好控制输出格式。

"{0:e},{0:E},{0:f},{0:%}".format(3.14)
Out[33]: '3.140000e+00,3.140000E+00,3.140000,314.000000%'

"{0:.2e},{0:.2E},{0:.2f},{0:.2%}".format(3.14)
Out[34]: '3.14e+00,3.14E+00,3.14,314.00%'

 三、f-string来格式化字符串——python3.6以上

f-string采用 {content:format} 设置字符串格式,其中 content 是替换并填入字符串的内容,可以是变量、表达式或函数等,format 是格式描述符。采用默认格式时不必指定 {:format},如上面例子所示只写 {content} 即可。

关于格式描述符的详细语法及含义可查阅Python官方文档,这里按使用时的先后顺序简要介绍常用格式描述符的含义与作用:

关于这个format的格式,我们依然使用前面的方法二种format来格式化字符串的顺序来说明,也是按照下面这6个主要方面:

<填充><对齐><宽度><,><.精度><类型>6 个字段,但是还有所拓展

format_spec  格式:   [[fill]align][sign][#][0][width][grouping_option][.precision][type]
即format一般的格式为
[填充字符][对齐方式][数字的正负号显示][#][0][宽度][千分位分组符号][.小数精度][类型]

1)填充 fill :     可以是任何的字符
2)对齐 align:     "<" | ">" | "=" | "^"
3)符号 sign :     这个仅仅对数值有效 "+" | "-" | " "
4)宽度 width:     是一个整数数值,表示多少宽度
5)grouping_option:表示千分位的分隔符号,可以是  "_" | ","
6)精度 precision :.数字 
7)类型 type :     "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

下面是一些详细说明

(2)对齐align

对其align含义与作用
<左对齐(字符串默认对齐方式)
>右对齐(数值默认对齐方式)
^居中

(3)符号sign

数字符号sign含义与作用
+负数前加负号(-),正数前加正号(+)
-负数前加负号(-),正数前不加任何符号(默认)
(空格)负数前加负号(-),正数前加一个空格

注:仅适用于数值类型。

(4)# 符号说明

# 描述符格式描述符含义与作用
#切换数字显示方式

注1:仅适用于数值类型。

注2:# 对不同数值类型的作用效果不同,详见下表:

数值类型不加#(默认)#区别
二进制整数'1111011''0b1111011'开头是否显示 0b
八进制整数'173''0o173'开头是否显示 0o
十进制整数'123''123'无区别
十六进制整数(小写字母)'7b''0x7b'开头是否显示 0x
十六进制整数(大写字母)'7B''0X7B'开头是否显示 0X

(5)宽度与精度

宽度与精度相关格式描述符

格式描述符含义与作用
width整数 width 指定宽度
0width整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度
width.precision整数 width 指定宽度,整数 precision 指定显示精度

注1:0width 不可用于复数类型和非数值类型,width.precision 不可用于整数类型。
注2:width.precision 用于不同格式类型的浮点数、复数时的含义也不同:用于 fFeE 和 % 时 precision 指定的是小数点后的位数,用于 g 和 G 时 precision 指定的是有效数字位数(小数点前位数+小数点后位数)。
注3:width.precision 除浮点数、复数外还可用于字符串,此时 precision 含义是只使用字符串中前 precision 位字符。

(6)千位分隔符相关格式描述符

格式描述符含义与作用
,使用,作为千位分隔符
_使用_作为千位分隔符

注1:若不指定 , 或 _,则f-string不使用任何千位分隔符,此为默认设置。
注2:, 仅适用于浮点数、复数与十进制整数:对于浮点数和复数,, 只分隔小数点前的数位。
注3:_ 适用于浮点数、复数与二、八、十、十六进制整数:对于浮点数和复数,_ 只分隔小数点前的数位;对于二、八、十六进制整数,固定从低位到高位每隔四位插入一个 _(十进制整数是每隔三位插入一个 _)。

(7)类型描述

格式描述符含义与作用适用变量类型
s普通字符串格式字符串
b二进制整数格式整数
c字符格式,按unicode编码将整数转换为对应字符整数
d十进制整数格式整数
o八进制整数格式整数
x十六进制整数格式(小写字母)整数
X十六进制整数格式(大写字母)整数
e科学计数格式,以 e 表示 ×10^浮点数、复数、整数(自动转换为浮点数)
E与 e 等价,但以 E 表示 ×10^浮点数、复数、整数(自动转换为浮点数)
f定点数格式,默认精度(precision)是6浮点数、复数、整数(自动转换为浮点数)
F与 f 等价,但将 nan 和 inf 换成 NAN 和 INF浮点数、复数、整数(自动转换为浮点数)
g通用格式,小数用 f,大数用 e浮点数、复数、整数(自动转换为浮点数)
G与 G 等价,但小数用 F,大数用 E浮点数、复数、整数(自动转换为浮点数)
%百分比格式,数字自动乘上100后按 f 格式排版,并加 % 后缀浮点数、整数(自动转换为浮点数)

常用的特殊格式类型:标准库 datetime 给定的用于排版时间信息的格式类型,适用于 datedatetime 和 time 对象

格式描述符含义显示样例
%a星期几(缩写)'Sun'
%A星期几(全名)'Sunday'
%w星期几(数字,0 是周日,6 是周六)'0'
%u星期几(数字,1 是周一,7 是周日)'7'
%d日(数字,以 0 补足两位)'07'
%b月(缩写)'Aug'
%B月(全名)'August'
%m月(数字,以 0 补足两位)'08'
%y年(后两位数字,以 0 补足两位)'14'
%Y年(完整数字,不补零)'2014'
%H小时(24小时制,以 0 补足两位)'23'
%I小时(12小时制,以 0 补足两位)'11'
%p上午/下午'PM'
%M分钟(以 0 补足两位)'23'
%S秒钟(以 0 补足两位)'56'
%f微秒(以 0 补足六位)'553777'
%zUTC偏移量(格式是 ±HHMM[SS],未指定时区则返回空字符串)'+1030'
%Z时区名(未指定时区则返回空字符串)'EST'
%j一年中的第几天(以 0 补足三位)'195'
%U一年中的第几周(以全年首个周日后的星期为第0周,以 0 补足两位)'27'
%w一年中的第几周(以全年首个周一后的星期为第0周,以 0 补足两位)'28'
%V一年中的第几周(以全年首个包含1月4日的星期为第1周,以 0 补足两位)'28'

 

四、字符串模板 string template

从简单的例子看起

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'

详细关于字符串模板的使用请参考官方文档:

https://docs.python.org/3/library/string.html


浏览 44
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报