Python str.format()的使用方法

str.format()方法是用来格式化字符串的,可以将变量插入给定字符串中,也可以控制格式。

占位符{}

format使用大括号{}来当占位符,大括号中包含三个字段,其标准形式是
{ [field_name] ["!" conversion] [":" format_spec] }
中括号表示可选部分
field_name:表示这个占位符引用的变量。
conversion:表示在格式化之前对变量进行转换的方法,可以用’!s’表示先使用str()方法,’!r’表示先使用repr()方法,’!a’表示先使用ascii()方法处理变量。
format_spec:就是格式化字段啦,在下面会详细讲。

format引用变量的方式

>>> name = 'tim'
>>> age = 19

>>> 'My name is {}, and i am {}'.format(name, age)  # {}用来做占位符,返回的字符串中,会将给format的参数插入字符串内,如果大括号内什么都不写,默认就是从左到右按序号0,1,2...排列
'My name is tim, and i am 19'

>>> 'My name is {1}, and i am {0}'.format(age, name)  # 可以在大括号中加入数字,表示编号,这里{0}对应的是age,{1}对应的是name
'My name is tim, and i am 19'

>>> 'My name is {name}, and i am {age}'.format(name=name, age=age)  # 也可以给使用字符串给占位符命名,在给format参数的时候使用"占位符名=变量"的形式
'My name is tim, and i am 19'

>>> kv = {'name' : 'tim', 'age' : 19}
>>> 'My name is {name}, and i am {age}'.format(**kv)  # 既然有上面的方式,就可以使用**解字典的方式给format提供参数
'My name is tim, and i am 19'

format还可以使用一些类似python语法的方式访问一些数据结构,如:

>>> fruitlist = [('apple', '$1.99'), ('banana', '$2.99')]
>>> '{0[0][0]} is {0[0][1]}, while {0[1][0]} is {0[1][1]}'.format(fruitlist)
'apple is $1.99, while banana is $2.99'

其中,0[0][0]的第一个’0’表示format的第一个参数,也就是’fruitlist’,0[0][0]就表示 fruitlist[0][0] 也就是’apple’了。

访问字典:

>>> fruitdict = {'apple':'$1.99', 'banana': '$2.99'}
>>> 'apple is {0[apple]}, while banana is {0[banana]}'.format(fruitdict)
'apple is $1.99, while banana is $2.99'

注意,字典中的字符串在引用时不需要加单引号或双引号,如 0[apple] 表示 fruitdict['apple'],这就导致数字和数字字符串难以区分,如下:

>>> numberdict = {'0' : 'string zero', 0 : 'number zero'}
>>> 'It is {0[0]}'.format(numberdict)
'It is number zero'

还可以访问对象的属性:

>>> class person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

>>> a_person = person('tim', 19)

>>> 'my name is {0.name}, i am {0.age}'.format(a_person)  # '0'代表'a_person'
'my name is tim, i am 19'

甚至还可以访问模块:

>>> import sys
>>> 'My python verson is {0.version}'.format(sys) # '0.version' 表示 'sys.version'
'My python verson is 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)]'

 

format的格式控制

format_spec字段的完整定义是:[[fill]align][sign][#][0][width][,][.precision][type] 中括号部分可以省略

fill:填充符,可以使用除’}’外的所有字符,必须要有对齐标识符,填充符才有效
align:对齐标识符,有:

align
Meaning
‘<‘
左对齐
‘>’
右对齐
‘=’
强制符号位在占位符前面,而不是在数字前面
‘^’
居中对齐

sign:符号标识符,可以使用”+”:正数也显示符号,”-“:只有负数才显示符号(默认)  ” “:空格表示正数前有一个空格,负数前有负号
#:只对整数有效,显示前缀’0b’, ‘0o’, ‘0x’
width:表示字符串的宽度,在前面加0表示使用0填充
,:使用千位分隔符
.precision:表示小数点后应该保留几位
type:表示类型

对于字符串来说,类型有:

type
Meaning
‘s’
字符串输出
None
同’s’

对于整型来说,类型有:

type
Meaning
‘b’
使用二进制形式输出
‘c’
以单字符的形式输出(将整数转换成对应的unicode字符)
‘d’
使用十进制形式输出
‘o’
使用八进制形式输出
‘x’
使用十六进制形式输出,字母使用小写
‘X’
使用十六进制形式输出,字母使用大写
‘n’
表示数字,使用本地的设置在数字中适当插入分隔符
None
同’d’

对于浮点数来说,类型有:

type
Meaning
‘e’
使用科学计数法来打印浮点数,用e来表示指数
‘E’
同’e’,但用E来表示指数
‘f’
定点表示
‘F’
同’f’,但用INF替代inf,NAN替代nan
‘g’
通用模式,根据情况选择使用’e’或’f’的形式表示
‘G’
通用模式,根据情况选择使用’E’或’F’的形式表示
‘n’
表示数字,使用本地的设置在数字中适当插入分隔符
‘%’
表示百分数,将浮点数乘100,使用’f’的形式显示,并再末尾加百分号%
None
跟’g’相似

 

使用对齐:

>>> '{:<30}'.format('left')  # <表示左对齐,30为宽度
'left                          '
>>> '{:>30}'.format('right')  # >表示右对齐
'                         right'  
>>> '{:^30}'.format('center')  # ^表示居中对齐
'            center            '
>>> '{:#^30}'.format('center')  #  其中的井号#表示填充字符
'############center############'

使用不同进制:

>>> '{0:#d} {0:#b} {0:#o} {0:#x}'.format(24)  # 其中的井号#表示显示前缀
'24 0b11000 0o30 0x18'

format的参数非常灵活,可以嵌套使用,如:

>>> for w in range(1, 10):
        print('|{0:{fill}>{width}}|'.format(w, fill=w, width=w))

 
|1|
|22|
|333|
|4444|
|55555|
|666666|
|7777777|
|88888888|
|999999999|

在每轮循环里,相当于先用format把format_spec字段先构造了一遍,构造成’|{0:w>w}|’这个字符串(这里的w为确定的数),再调用一次format完成格式化。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据