python格式化字符输出 str.format()

需求分析

字符串格式化是编程常见操作,python中也对此有强大的支持。python3.6中有利用%str.format()来操作的,python3.6也新增了f-string的方法。本文简单讲解str.format(),通过其绘制一个简单表格。如下图

看起来还算不错吧

下面是一些原数据,三个列表。

label = ['TP', 'FN', 'FP','TN', 'Sn/RE(%)', 'Sp(%)', 'Acc', 'Mcc', 'PPV/PR(%)', 'Str(%)', 'FPR(%)']
data1 = ['209', '43', '25', '227', '82.9365%', '90.0794%', '86.5079%', '73.2029%', '89.3162%', '86.5079%', '9.9206%']
data2 = ['227', '25', '43', '209', '90.0794%', '82.9365%', '86.5079%', '73.2029%', '84.0741%', '86.5079%', '17.0635%']

利用 ' '.join()

不知道格式化字符串的话,可能会通过下面代码实现来输出数据:

for i in [label, data1, data2]:
    print('    '.join(i)) # join()

上面的代码可能会造成下面的现象,没有对齐。

没对齐的表格

有的会想是因为label数据和data的数据长度不一样,调一下相隔的宽度就行。' '.join() 这个是固定的,调节' '的大小,列表所有元素相邻间隔就变动了,要找到一个合适的间隔不太容易。

% 方法

接触过格式化字符串的话,可能先想到的是 %。上面代码改为

for i in [label, data1, data2]:
    s = '%s  %s  %s %s  %s  %s  %s   %s  %s  %s   %s'%(i[0],i[1],i[2]...i[10])#偷懒,明白就好
    print(s)

然后结果是这样:


还是不对齐

你看了看,这不是join()函数,这是利用 % 可以自由更改它们之间的间距,然后你修改了代码:

for v,i in enumerate([label, num1, num2]):
    if v == 10:
        s = '%s  %s   %s  %s    %s      %s     %s     %s    %s    %s   %s'%(i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10])
    else:
        s = '%s  %s  %s  %s  %s  %s  %s   %s  %s  %s   %s'%(i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10])
    print(s)

结果很不错,他们已经对齐了:


成功了

但是,过程确实不容易,且不说%后面的跟着的一长串字符,不能利用拆包,只能一个萝卜一个坑的对应这放进去,容易出现小失误。接下来介绍str.format()就比这优雅。不过我觉得新手应该比较喜欢用%吧,,因为这比str.format()少打一个单词。。。

str.format()

直接上代码了

直接这样和利用%是一样的
str_f = '{}  {}  {}  {}    {}    {}   {}    {}    {}    {}    {}'
#加索引,和上面不加就本例子来说,效果差不多。不过加了能加清楚有多少个,和有其它用途)
#str_f = '{0}  {1}  {2}  {3}    {4}    {5}   {6}    {7}    {8}    {9}    {10}'
for i in [label, data1, data2]:
    print(str_f.format(*i))

#继续改进
str_f1 = '{:^8}  {:^8}  {:^8}  {:^8}    {:^8}    {:^8}   {:^8}    {:^8}  |  {:^9}    {:^8}  |  {:^8}'
for i in [label, data1, data2]:
    print(str_f1.format(*i))

#这个你会发现,前四个数字用不了那么大的间距,继续修改代码。
print('-'*116)
str_f2 = '{:^4} | {:^4} | {:^4} | {:^4}  |  {:^8}  |  {:^8} |  {:^8}  |  {:^8}  |  {:^9}  |  {:^8}  |  {:^8}'
for i in [label, data1, data2]:
    print(str_f2.format(*i))
print('-'*116)
效果

下面是{}里面的一些格式说明符。

#摘自python官方文档
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::= integer
precision   ::= integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

主要讲解下文本所用到的格式说明符,'{}'就像excel里的单元格,不过这里的{}与{}之间可以设置不同字符如,'{} {}';align就像是单元格居中(…^),居左(<)还是居中(>)。width是单元格的宽度,在实际中就是根据字符的长度可以设置不同的宽度。本文中就分别设置了4,8。fill 是填充物,将单元格剩余空格填充指定字符,sign是指定数字前的符号(+,-),precision是数字精度长度。type,数据类型。(%也有上述差不多的功能,不过之前未曾提及。感兴趣,请上网搜索)
还有个值得提的是str.format()里的参数支持拆包,从上面代码可以看出不用像%那样将每个元素都写出来了。


f-string

f-string是python3.6新增的,此处简要只写相关代码。

#打印出来效果和上面str_f1差不多。
for i in [label, data1, data2]:
    a = ' | '.join([f"{a:{9}}" for a in (i)])
    fs = f'{a}'
    print(fs)

加几个官方例子:

>>> value = 4 * 20
>>> f'The value is {value}.'
'The value is 80.'

>>> f'{{ {4*10} }}'
'{ 40 }'
>>> f'{{{4*10}}}'
'{40}'

>>> def foo():
...   return 20
...
>>> f'result={foo()}'
'result=20'


了解更多str.format()请点击官网
了解更多f-string请点击pep498
python控制台动画

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容