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

前言:本文详细整理了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 指定的是小数点后的位数,用于 gGprecision 指定的是有效数字位数(小数点前位数+小数点后位数)。
注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 等价,但将 naninf 换成 NANINF 浮点数、复数、整数(自动转换为浮点数)
g 通用格式,小数用 f,大数用 e 浮点数、复数、整数(自动转换为浮点数)
G G 等价,但小数用 F,大数用 E 浮点数、复数、整数(自动转换为浮点数)
% 百分比格式,数字自动乘上100后按 f 格式排版,并加 % 后缀 浮点数、整数(自动转换为浮点数)

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

格式描述符 含义 显示样例
%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'
%z UTC偏移量(格式是 ±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

你可能感兴趣的:(python进阶,python)