python格式化字符_Python格式化字符串

格式化字符串

在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。

模板

格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple(其实可以不写tuple括号也可以)将多个值传递给模板,每个值对应一个格式符。如下面的例子:

print("I'm %s. I'm %d year old" % ('Hom', 30))

"I'm %s. I'm %d year old" 为我们的模板。%s为第一个格式符,表示一个字符串。%d为第二个格式符,表示一个整数。('Hom', 30)的两个元素'Hom'和30为替换%s和%d的真实值。 在模板和tuple之间,有一个%号分隔,它代表了格式化操作。

整个表达式实际上构成一个字符串表达式。我们可以像一个正常的字符串那样,将它赋值给某个变量,如:

a = "I'm %s. I'm %d year old" % ('Hom', 30)

print a

也可以用词典来传递真实值,如:

print("I'm %(name)s. I'm %(age)d year old" % {'name':'Hom', 'age':30})

可以看到,我们对两个格式符进行了命名。命名使用()括起来。每个命名对应词典的一个key。

格式符

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

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

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

%c 单个字符(chr()函数转换)

%b 二进制整数(只能用于字符串format方法和format函数,%不能用.)

%d和%i 十进制整数(带符号)

%u 十进制整数(不带符号)

%o 八进制整数

%x和%X 十六进制整数, 区别在于输出时大小写.

%e和%E 指数 (基底写为e或E)

%f和%F 浮点数

%g和%G 指数(e/E)或浮点数 (根据显示长度), 即%e和%f自动判断

%% 输出字符%

要是想输出%则要使用%%进行转义操作.

更复杂的控制

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

(name): 命名,用于字典控制赋值

flags: 可以有+,-,, 0, # :

+ 表示右对齐(默认形式)。一般在数值数据要显示正负号时使用.

- 表示左对齐。

为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。

0 表示使用0填充左侧多余空格部分。仅对数值起效, 不能和-一起用.

# 对于八进制和十六进制, 前面显示0或0x或0X

width: 显示宽度,总长度,会补齐空格. 该部分可以设为*, 此时长度由后面的元组中指定.

.precision: 对于数值, 表示小数点后精度; 对于数值转字符串, 表示字符串有效长度(包括.+-符号). 该部分可以设为*, 此时长度由后面的元组中指定.

比如:

>>> "%s" % 1.23

'1.23'

>>> "%f" % 1.23

'1.230000'

>>> "%d" % 1.23

'1'

>>> "%e" % 1.23

'1.230000e+00'

>>> "%E" % 1.23

'1.230000E+00'

>>> "%7.3f" % 1.23

' 1.230'

>>> "%-7.3f" % 1.23

'1.230 '

>>> "%- 7.3f" % 1.23

' 1.230 '

>>> "%+7.3f" % 1.23

' +1.230'

>>> "%+08.3f" % 1.23

'+001.230'

>>> "%+7.3s" % 1.23

' 1.2'

>>> "%+7.4s" % 1.23

' 1.23'

>>> "%*.*f" % (10,4,1.23)

' 1.2300'

>>> "%d to hex is %#x" %(100, 100)

'100 to hex is 0x64'

>>> "%- *d to hex is %#X" % (7, 100, 100)

' 100 to hex is 0X64'

>>> "%(name)s is %(age)d years old" % {'name': "Zhao",'age':18}

'Zhao is 18 years old'

上面的width, precision为两个整数。我们可以利用*,来动态代入这两个量。比如:

# python 3.0

print("%.*f" % (4, 1.2)) # "1.2000"

Python实际上用4来替换*。所以实际的模板为"%.4f"。

format函数和字符串format方法

这是另一种处理方法格式化方法: 通过format函数/str的format方法. 例如下面的例子:

要将一个列表(float型)的内容格式化并空格分隔写到文件中,一行怎么写?

# 利用map构造函数

f.write( ' '.join(map((lambda v: format(v, '<8.5f')),list))

# 利用列表生成器

f.write(' '.join([ "%-8.5f" % i for i in lll]))

两者结果是一致的. 用lambda函数的好处是, 可以定义一个新函数来方便统一处理一系列的格式, 当需要修改时只修改一处即可. 而%方法则要把每处的格式化式改写一遍.

另外, 试试:

print "%-"+str(var)+".5f" % i, 你会发现报错: not all arguments converted during string formatting, 原因是该格式化字符串先执行再相加, 即".5f" % i优先, 要是print ("%-"+str(var)+".5f") % i 则没有问题. 格式化串分析在字符串合并前进行,因此错了. 但format(i, "<"+str(var)+".5f") 是可行的

format函数

format函数执行简单的值转换. 他不适用模板, 只是简单地把值转为指定的输出格式.

format(value[, format_spec]), 后面是格式表达式的字符串, 默认是"", 即不格式化直接字符串化. 很基础简单的函数.

和%格式化式类似, 支持上面提及的[flags][width].[precision]typecode 格式化表达式. 但注意:

format函数不需要%或后面提到的:. 即直接转换.

format函数左中右对齐分别使用<^>, 而不使用-

空白部分用0填充, "0<6.3f"这些表达是一样的. (%方法不能右侧补0)

第一个特殊字符为填充的字符,只能是一个字符,不指定的话默认是用空格填充(0只是特例)

只能对单一个元素进行操作, 不支持别名(name),不支持字典, 列表等.

对于长数值, 还可以用控制符,(千位分隔符)来控制输出成1,234,567

typecode可以支持b二进制.

>>> format(3.14,'+8.4f')

' +3.1400'

>>> format(3.14,'<8.4f')

'3.1400 '

>>> format(3.14,'^8.4f')

' 3.1400 '

>>> format(3.14,'08.4f')

'003.1400'

>>> format(3.14,'0<8.4f')

'3.140000'

>>> '%0-8.4f'%3.14

'3.1400 '

>>> format(99,'b')

'1100011'

>>> format(10000000,',')

'10,000,000'

字符串的format方法

字符串的format方法是最为强大的. 支持对该字符串(作为模板)进行格式化, 又像format函数一样有更丰富的支持.

str.format(*args, **kwargs), 支持多种方式的格式化, 在Python2.6后引入. 和之前两种方法不同, 主要使用{}和:进行控制格式化,前者指定位置, 后者相当于%.

映射式格式化

通过大括号标记为一个"元素", 然后format里的*args或**kwargs逐一对应进行填充. 支持多种方式:

通过索引号或位置对应: 可以使用参数位置定应的索引号进行对应, {index}; 也可以根据位置使用匿名方式(Py2.7+才支持), {},{}. 后者大括号对数超过参数个数, 或者索引号大于参数个数, 都会报错: IndexError: tuple index out of range

'{1},{0},{1}'.format('a',5)

## a,5,a

'{},{}'.format('a',5)

## a,5

通过序列调用下标

s=['Hom',30]

'{0[0]}:{0[1]}'.format(s)

## 'Hom:30'

通过命名方式()

通过显示参数赋值, 定义一个局部变量. 可以使用该局部变量名或者该对象的属性来填充.

'{name}:{age}'.format(age=30,name="Hom")

## 'Hom:30'

c=CC(); c.name='Hom'; c.age=30

'{p.name}:{p.age}'.format(p=c)

格式限定符

首先将格式化限定式写在{}内, :作为格式化标识开始. 同样支持 [flags][width].[precision]typecode 格式化表达式:

{}将被格式化的部分写在这里面

:后面接格式化表达式

左中右对齐和format函数一样, 使用<^>, 而不是-

支持二进制b和千位分隔符,.(同format函数)

:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

'{:<8.4f}'.format(6.4)

## '6.4000 '

'{:0>8}'.format('189')

## '00000189'

'{:_>8}'.format('189')

## '_____189'

'{:b}'.format(17)

## '10001'

'{:,}'.format(1234567890)

## '1,234,567,890'

string.Template 模板对象

其实,在Python中进行字符串的格式化,除了格式化操作符,还可以使用string模块中的字符串模板(Template)对象。下面就主要看看Template对象的substitute()方法:

from string import Template

s = Template("Hi, $name! $name is learning $language")

print s.substitute(name="Zhao", language="Python")

## Hi, Zhao! Zhao is learning Python

d = {"name": "Hom", "language": "C#"}

print s.substitute(d)

## Hi, Hom! Hom is learning C#

# 用$$表示$符号

s = Template("This book ($bname) is 99$$")

print s.substitute(bname="Learning Python")

## This book (Learning Python) is 99$

这种方法比较落后少用了.

总结

Python中内置的% 操作符可用于格式化字符串操作,控制字符串的呈现格式。Python中还有其他的格式化字符串的方式,但%操作符的使用是最方便的。

format函数提供函数化的格式化办法, 而字符串的format方法则提供更丰富的操作方式.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值