Python字符串格式化输出,在python编程中,是一个非常重要的知识点,掌握了它,你就可以输出各种格式要求的文本内容,并生成相关要求的文件。下面介绍Python格式化字符串的四种方式,并给出了比较详尽的参数说明和举例,希望能够帮助到大家,以下是详细的内容:
这是最早的字符格式化方法。字符串格式化使用与 C语言 中 sprintf 函数一样的语法。如果您没有使用过C语言,也没有关系,看看下面的表格参数的描述和例子也就明白了。
基本语法是:字符串 % ()
python字符串格式化符号:
符 号 |
描述 |
%c |
格式化字符及其ASCII码 |
%s |
格式化字符串 |
%d |
格式化整数 |
%u |
格式化无符号整型 |
%o |
格式化无符号八进制数 |
%x |
格式化无符号十六进制数 |
%X |
格式化无符号十六进制数(大写) |
%f |
格式化浮点数字,可指定小数点后的精度 |
%e |
用科学计数法格式化浮点数 |
%E |
作用同%e,用科学计数法格式化浮点数 |
%g |
%f和%e的简写 |
%G |
%f 和 %E 的简写 |
%p |
用十六进制数格式化变量的地址 |
格式化操作符辅助指令:
符号 |
功能 |
* |
定义宽度或者小数点精度 |
- |
用做左对齐 |
+ |
在正数前面显示加号( + ) |
|
在正数前面显示空格 |
# |
在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X') |
0 |
显示的数字前面填充'0'而不是默认的空格 |
% |
'%%'输出一个单一的'%' |
(var) |
映射变量(字典参数) |
m.n. |
m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
注:默认是右对齐。
当需格式化的字符串或者数字过多时,位置搞混估计有很大的可能。举例如下:
a = '张三'
b = '李四'
c = 3.1415926
print('%s和%s是兄弟!π=%5.2f' % (a, b , c)) # 张三和李四是兄弟!π= 3.14
print("%s和%s是兄弟!π=%5.2f" % ("张三", '李四', 3.14151926)) # 张三和李四是兄弟!π= 3.14
通过字典方式格式化,打破了位置带来的限制与困扰。
如:%4d格式化数据,输出整数位4位,右对齐数字不足用空格代替。
print("我叫%(name)s,年龄%(age)4d岁" % {"name": '张三', "age": 20}) # 我叫张三, 年龄 20岁
kwargs = {"name": "张三", "age": 18}
print("我叫%(name)s, 年龄%(age)d岁" % kwargs) # 我叫张三, 年龄18岁
format函数,它增强了字符串格式化的功能。str.format的格式化字符串的方式比%在性能和灵活性上要好很多。好处是format 函数可以接受不限个数的参数,而且位置可以不按顺序。
基本语法是通过 {} 和 : 来代替前面的 % 。
按照位置一一对应,这一点和%一样。
print("{}和{}是好朋友!".format('张三', '李四')) # 张三和李四是好朋友!
使用索引取对应位置的值,这是位置可以任意,按照需要排列。
print('{0}{0}{1}{0}'.format('张三', '李四')) # 张三张三李四张三
通过关键字的方式格式化,打破了位置带来的限制与困扰。这一点也和%类似。
print("我叫{name}, 年龄{age}岁。".format(age=18, name="张三"))
通过字典方式的方式格式化,也能达到关键字参数的效果。
kwargs = {'name': '张三', "age": 18}
print("我叫{name}, 年龄{age}岁。".format(**kwargs)) # 使用**进行解包操作
注意:**kwargs,使用**进行解包操作,这点非常重要。新手容易不写**,而程序报错。
先取到值(使用数字索引),然后在冒号后面设定填充格式:[填充字符][对齐方式][宽度]
^, <, > 分别是居中、左对齐、右对齐。后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。
需要注意的是,每个汉字算一个字符。这一点和C语言不一样的,C语言中,一个汉字计算为2个字符。举例如下:
#*<20: 意思是: 左对齐,总共20个字符,不足部分用*号填充
print("我叫{0:*<20},年龄 {1:*<10}岁!".format("张三", 18)) # 我叫张三******************,年龄 18********岁!
# *>10: 右对齐,总共10个字符,不足部分用*填充
print("我叫{0:*<10}".format("张三")) # 我叫张三********
# *^18: 居中,总共18个字符,不足部分用*填充
print("我叫{0:*^18}".format("张三")) # 我叫********张三********
# ^20: 居中,总共20个字符,不足部分用空白填充
print("我叫{0:^20}".format("张三")) # 我叫 张三
数字 |
格式 |
输出 |
描述 |
3.1415926 |
{:.2f} |
3.14 |
保留小数点后两位 |
3.1415926 |
{:+.2f} |
+3.14 |
带符号保留小数点后两位 |
-1 |
{:-.2f} |
-1.00 |
带符号保留小数点后两位 |
2.71828 |
{:.0f} |
3 |
不带小数 |
5 |
{:0>2d} |
05 |
数字补零 (填充左边, 宽度为2) |
5 |
{:x<4d} |
5xxx |
数字补x (填充右边, 宽度为4) |
10 |
{:x<4d} |
10xx |
数字补x (填充右边, 宽度为4) |
1000000 |
{:,} |
1,000,000 |
以逗号分隔的数字格式 |
0.25 |
{:.2%} |
25.00% |
百分比格式 |
1000000000 |
{:.2e} |
1.00e+09 |
指数记法 |
13 |
{:>10d} |
13 |
右对齐 (默认, 宽度为10) |
13 |
{:<10d} |
13 |
左对齐 (宽度为10) |
13 |
{:^10d} |
13 |
中间对齐 (宽度为10) |
11 |
'{:b}'.format(11) '{:d}'.format(11) '{:o}'.format(11) '{:x}'.format(11) '{:#x}'.format(11) '{:#X}'.format(11) |
1011 11 13 B 0xb 0XB |
进制 |
^, <, > 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。
+ 表示在正数前显示 +,负数前显示 -; (空格)表示在正数前加空格
b、d、o、x 分别是二进制、十进制、八进制、十六进制。
举例如下:
# 123456.12精确到小数点后2位,四舍五入
print("{temp:.2f}".format(temp=123456.1234567))
# 123456.1234567890精确到小数点后10位,四舍五入
print("{temp:.10f}".format(temp=123456.1234567))
# ---3.14--- 取2位小数后,居中,共10位,其余用-填充
print("{:-^10.2f}".format(3.1415926))
# 1111011 转成二进制
print("{0:b}".format(123))
# 1,234,567 千分位格式化
print("{0:,}".format(1234567))
需要注意的是:如果字符串里出现大括号 {} ,可以通过重复的方法,使用大括号 {} 来转义大括号。
举例如下:
#张三对应的位置是{0}
print ("{}对应的位置是{{0}}".format("张三"))
f-Strings称之为格式化字符串常量(formatted string literals)以F或者f开头,后面跟字符串,在字符串中,以大括号 {} 标明被替换的字段,将变量或表达式计算后的值替换进去。f-string在本质上并不是字符串常量,而是一个在运行时运算求值的表达式。
f-string是以f或F开头的字符串,这样表达非常简练。
name = '张三'
print(f"我叫{name}") # 我叫张三
在{}中放置任意合法的表达式,会在运行时计算。
print(f"{3 * 3 / 2}") # 4.5
a = 1
b = 2
print(f"a + b = {a + b}") # a + b = 3
name = 'zhangsan'
print(F"我叫{name.upper()}") # 我叫ZHANGSAN
name = '张三'
print(F"我叫{len(name)}") # 我叫2
注意汉字'张三'的长度是2,而不是4。
def test(n):
return n
print(F"{test(10)}") # 10 执行时打印函数的返回值
需要注意的是:
(1)在{}中使用‘或者”,保证{}内外使用的不一样即可。
(2)在{}中需要同时使用’和“,则需要外部字符串使用文档字符串符号三个单引号或者三个双引号。
(3){}中不允许出现\即使作为函数参数;必须使用的话,可以采用将包含\的内容赋值到一个变量里,然后再使用这个变量进行格式化输出。
(4)f.string 格式可用于多行字符串,其方法和长字符串的表达是一样的。
这是string模块提供的一个模版类,默认使用$ 或者 ${}(建议用这个)来占位,而不是用%,具体用法如下:
首先是引用库:
from string import Template
s = 'hi!${name}'
res = Template(s).substitute(name='张三') # substitute替代的意思
print(res) # hi!张三
需要注意的是:
(1)当需要输出一个$符号时,可以使用$$,也就是重复一下。
(2)当格式化字符串中有变量未给出值时,使用safe_substitute函数,此函数将占位符当成字符串输出,如果使用substitute会报错
(1)str.format() 比%格式化高级了一些。但是它还是有自己的缺陷。当需要传入的字符串过多时,仍然会显得非常冗长。str.format更简洁,性能上比%也更胜一筹。
(2)f-strings,不仅str.format更简洁,性能上也更胜一筹。
(3)f-string在功能方面不逊于传统的%语句和str.format()函数,同时性能又优于两者,且使用起来也更加简洁明了,因此推荐使用f-string进行字符串格式化。
(4)注意使用环境是python 3.6及以上。
(5)string模块提供的模版类,是另外一种字符串格式化输出的方法。