Python字符串格式化

Python中格式化字符串的方式有两种,一种是使用百分号的方式;一种是使用format方式。使用百分号的方式比较古老,而使用format则是比较“先进”的方式,目前两者并存

Python Version: 3.5+

百分号的方式格式化字符串

语法格式:

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

在学习更多参数之前,我们先来回顾以下,使用百分号的最简单的用法,是怎么实现的

1
2
3
>>> s = 'My name is %s, I am %d.' % ('Polar Snow', 25)
>>> s
'My name is Polar Snow, I am 25.'

在这种多占位符的情况下,后面的括号中传入的是一个列表,根据索引,分别对应前面字符串占位符的第0个和第1个。

(name)

可选,用于选择指定的key

1
2
3
>>> s = 'My name is %(name)s, I am %(age)d.' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am 25.'

使用这种方式的好处是显而易见的,如果一长串字符串中有N多个占位符,极有可能无法保证一一对应,而且占位符多了,很容易记混第几个占位符是干嘛的。使用这种“字典”的方式,给每个占位符起名字,赋值的时候根据名字赋值,传递的位置不需要一一对应。

1
2
3
>>> s = 'My name is %(name)s, Hello %(name)s.' % {'name': 'Polar Snow'}
>>> s
'My name is Polar Snow, Hello Polar Snow.'

flags

可选,提供以下的值可以选择:

符号 对齐 说明
+ 右对齐 正数前加+,负数前加-
- 左对齐 正数前无符号,负数前加-
空格 右对齐 正数前加空格,负数前加-
0 右对齐 正数前无符号,负数前加-,用0填充空白处

对齐的特性需要width参数的支持

  • +
1
2
3
4
5
6
7
>>> s = 'My name is %(name)s, I am %(age)+d.' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am +25.'
------
>>> s = 'My name is %(name)s, I am %(age)+d.' % {'name': 'Polar Snow', 'age': -25}
>>> s
'My name is Polar Snow, I am -25.'
  • -
1
2
3
4
5
6
7
>>> s = 'My name is %(name)s, I am %(age)-d.' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am 25.'
------
>>> s = 'My name is %(name)s, I am %(age)-d.' % {'name': 'Polar Snow', 'age': -25}
>>> s
'My name is Polar Snow, I am -25.'
  • 空格
1
2
3
4
5
6
7
>>> s = 'My name is %(name)s, I am [%(age) d].' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am [ 25].'
------
>>> s = 'My name is %(name)s, I am [%(age) d].' % {'name': 'Polar Snow', 'age': -25}
>>> s
'My name is Polar Snow, I am [-25].'
  • 0
1
2
3
4
5
6
7
>>> s = 'My name is %(name)s, I am %(age)0d.' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am 25.'
------
>>> s = 'My name is %(name)s, I am %(age)0d.' % {'name': 'Polar Snow', 'age': -25}
>>> s
'My name is Polar Snow, I am -25.'

width

可选,占位符的宽度

1
2
3
4
5
6
7
>>> s = 'My name is %(name)s, I am [%(age)05d].' % {'name': 'Polar Snow', 'age': -25}
>>> s
'My name is Polar Snow, I am [-0025].'
------
>>> s = 'My name is %(name)s, I am [%(age)05d].' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am [00025].'

有个宽度的设置,上面的对齐才能看出效果

1
2
3
4
5
6
7
>>> s = 'My name is %(name)s, I am [%(age)+5d].' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am [ +25].'
------
>>> s = 'My name is %(name)s, I am [%(age) 5d].' % {'name': 'Polar Snow', 'age': 25}
>>> s
'My name is Polar Snow, I am [ 25].'

.precision

可选,小数点后保留的位数(还有四舍五入哦!)

1
2
3
>>> s = 'My name is %(name)s, I am [%(age) 9.3f].' % {'name': 'Polar Snow', 'age': 25.2525252525}
>>> s
'My name is Polar Snow, I am [ 25.253].'

typecode

  • s,获取传入对象的str方法的返回值,并将其格式化到指定位置
  • r,获取传入对象的repr方法的返回值,并将其格式化到指定位置
  • c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
  • o,将整数转换成 八 进制表示,并将其格式化到指定位置
  • x,将整数转换成十六进制表示,并将其格式化到指定位置
  • d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
  • e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
  • E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
  • f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
    F,同上
  • g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
  • G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
  • %,当字符串中存在格式化标志时,需要用 %%表示一个百分号

虽然上面列举辣么多字符类型,但是最常用的前面的例子中都已经使用过了!没错,就是s d f这三个货,特别提示一下,当你需要在字符串中打印%时,需要输入%%才能显示一个%


format方式格式化字符串

语法格式:

[[fill]align][sign][#][0][width][,][.precision][type]

使用format的最简单方式格式化字符串:

1
2
3
4
5
6
7
8
9
10
11
>>> s = 'My name is {}, I am {}.'.format('Polar Snow', 25.2525252525)
>>> s
'My name is Polar Snow, I am 25.2525252525.'
------
>>> s = 'My name is {}, I am {}.'.format('Polar Snow', 25)
>>> s
'My name is Polar Snow, I am 25.'
------
>>> s = 'My name is {name}, I am {age}.'.format(name='Polar Snow', age=25)
>>> s
'My name is Polar Snow, I am 25.'

在之前的Python笔记中,讲到参数的时候,提到过使用*args, **kwargs来当万能参数,包罗万象~ 而当参数为一个列表,而希望列表中的每一个元素去充当参数时,我们加上了*这个关键符号。区别就是如果传入参数的是一个列表,如果不加*,那么意味着整个列表是一个参数;而加上了*,则意味着将列表中的每一个元素取出充当参数。这个原理同样适用于字符串格式化,下面我们就用这种方法实现上面同样的效果。

1
2
3
4
5
6
7
>>> s = 'My name is {}, I am {}.'.format(*['Polar Snow', 25])
>>> s
'My name is Polar Snow, I am 25.'
------
>>> s = 'My name is {name}, I am {age}.'.format(**{'name': 'Polar Snow', 'age': 25})
>>> s
'My name is Polar Snow, I am 25.'

注意:只有format的方式支持加* **关键字符,使用%的方式不支持!

fill

可选,空白处填充的字符,需要配合width才能看出效果

align

可选,对齐方式,需要配合width才能看出效果

  • <,内容左对齐
  • ,内容右对齐(默认)

  • =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
  • ^,内容居中

sign

可选,数字前的符号

  • +,正号加正,负号加负;
  • -,正号不变,负号加负;
  • 空格 ,正号空格,负号加负;

#

可选,对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示

,

可选,为数字添加分隔符,如:1,000,000

width

可选,格式化占位符所占的宽度

.precision

可选,小数位保留精度

type

可选,格式化类型

  • 传入” 字符串类型 “的参数
    • s,格式化字符串类型数据
    • 空白,未指定类型,则默认是None,同s
  • 传入“ 整数类型 ”的参数
    • b,将10进制整数自动转换成2进制表示然后格式化
    • c,将10进制整数自动转换为其对应的unicode字符
    • d,十进制整数
    • o,将10进制整数自动转换成8进制表示然后格式化;
    • x,将10进制整数自动转换成16进制表示然后格式化(小写x)
    • X,将10进制整数自动转换成16进制表示然后格式化(大写X)
  • 传入“ 浮点型或小数类型 ”的参数
    • e, 转换为科学计数法(小写e)表示,然后格式化;
    • E, 转换为科学计数法(大写E)表示,然后格式化;
    • f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
    • F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
    • g, 自动在e和f中切换
    • G, 自动在E和F中切换
    • %,显示百分比(默认显示小数点后6位)

format中常用的格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 首先从最简单的开始
>>> s = 'My name is {}, I am {}.'.format('Polar Snow', 25)
>>> s
'My name is Polar Snow, I am 25.'
# 列表的形式传值
>>> s = 'My name is {}, I am {}.'.format(*['Polar Snow', 25])
>>> s
'My name is Polar Snow, I am 25.'
# 指定值列表的索引
>>> s = 'My name is {0}, I am {1}.'.format('Polar Snow', 25)
>>> s
'My name is Polar Snow, I am 25.'
>>> s = 'My name is {0}, I am {0}.'.format('Polar Snow', 25)
>>> s
'My name is Polar Snow, I am Polar Snow.'
# 甚至可以在嵌套中取值
>>> s = 'My name is {0[0]}, I am {0[1]}.'.format(['Polar Snow', 'Larry'], 25)
>>> s
'My name is Polar Snow, I am Larry.'
------
# 设置占位符名称
>>> s = 'My name is {name}, I am {age}.'.format(name='Polar Snow', age=25)
>>> s
'My name is Polar Snow, I am 25.'
# 字典的形式传值
>>> s = 'My name is {name}, I am {age}.'.format(**{'name': 'Polar Snow', 'age': 25})
>>> s
'My name is Polar Snow, I am 25.'
------
# format最省心的是不需要指定字符串类型,但是你也可以选择去指定
>>> s = "i am {:s}, age {:d}, money {:f}".format("seven", 25, 88888.1)
>>> s
'i am seven, age 25, money 88888.100000'
# 保留两位小数
>>> s = "i am {:s}, age {:d}, money {:.2f}".format("seven", 25, 88888.1)
>>> s
'i am seven, age 25, money 88888.10'
# 保留两位小数并在数字中用,分隔
>>> s = "i am {:s}, age {:d}, money {:,.2f}".format("seven", 25, 88888.1)
>>> s
'i am seven, age 25, money 88,888.10'
------
# 居中显示,插入[]是为了展示居中的效果更直观
>>> s = "i am {:s}, age [{:^10d}], money {:,.2f}".format("seven", 25, 88888.1)
>>> s
'i am seven, age [ 25 ], money 88,888.10'
------
# 数字的展示
>>> s = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)
>>> s
'numbers: 1111,17,15,f,F, 1500.000000%'
>>> s = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)
>>> s
'numbers: 1111,17,15,f,F, 1500.000000%'

如果以上这些还不能满足你的需求,请移步Python官方文档:Python Docs 4 String Format