一、用字符填充
>>> '{0:*>10}'.format(10) #冒號前的0為索引位置 '********10' >>> '{0:a>10}'.format(10) 'aaaaaaaa10'
>>> "{:010}".format(123) '0000000123'
二、指定對齊方式
1、左對齊 <
>>> "{:0<10}".format(123) '1230000000'
2、右對齊 >
>>> "{:0>10}".format(123) '0000000123'
3、居中 ^
>>> "{:0^10}".format(123) '0001230000'
三、實例:指定寬度打印價格列表
width = int(input('Input data:')) price_width = 10 item_width = width - price_width header_fm = '{{:{}}}{{:>{}}}'.format(item_width,price_width) fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width,price_width) print('='*width) print(header_fm.format('Item','Price')) print('-'*width) print(fmt.format('Apples',0.4)) print(fmt.format('Pears',0.5)) print(fmt.format('Cantaloupes',1.92)) print('='*width)
=================================== Item Price ----------------------------------- Apples 0.40 Pears 0.50 Cantaloupes 1.92 ===================================
1、花括號可以轉義花括號
上述是教程里的案例以及輸出內容,但是不太理解以下問題:
假定 item_width = 20,price_width = 15,那么 '{{:{}}}{{:>{}}}'.format(item_width,price_width) 就等於'{{:{}}}{{:>{}}}'.format(20,15),我用python自帶的idle獲取表達式'{{:{}}}{{:>{}}}'.format(20,15)的輸出結果為
>>> '{{:{}}}{{:>{}}}'.format(20,15) '{:20}{:>15}'
從之前的學習認知,我們可以知道,一對{}代表一個占位符,對應一個字符串。那么'{{:{}}}'.format(20) 應該是輸出 '{{:20}}',怎么會是{:20}呢,百思不得其解,百度了一波沒啥作用。后面在論壇上看到有人說花括號可以轉義花括號,這個問題就迎刃而解了
2、中文排版對齊問題
搬移代碼的時候,自動把入參換成中文了。發現同樣的代碼,英文輸出結果是對齊的,符合預期;而中文存在字符格式化不整齊的現象,存在一定偏移。
=================================== Item Price ----------------------------------- Apples 0.40 Pears 0.50 Cantaloupes 1.92 ===================================
=================================== Item Price ----------------------------------- 蘋果 0.40 梨 0.50 哈密瓜 1.92 ===================================
原因是在打印多組中文的時候,不是每組中文的字符串寬度都一樣,當中文字符寬度不夠的時候,程序采用英文空格填充,中英文空格寬度不一樣,就會導致輸出文本不整齊。所以解決方法就是在寬度不夠時采用中文空格填充,中文空格的編碼為chr(12288)。最后的代碼以及實現效果如下:
price_width = 10 item_width = width - price_width header_fm = '{{:{2}<{0}}}\t{{:{2}<{1}}}'.format(item_width,price_width,chr(12288)) #\t 當前八個字符的單元結束,進入到下一個八個字符的單元中 fmt = '{{:{2}<{0}}}\t{{:{2}<{1}.2f}}'.format(item_width,price_width,chr(12288)) print('='*50) print(header_fm.format('名稱','價格')) print('-'*50) print(fmt.format('蘋果',0.4)) print(fmt.format('梨',0.5)) print(fmt.format('哈密瓜',1.92)) print('='*50)
================================================== 名稱 價格 -------------------------------------------------- 蘋果 0.40 梨 0.50 哈密瓜 1.92 ==================================================
(1){{:{2}<{0}}},字符串默認向左對齊,為什么還要加對齊符<
---如果不加,第一次格式化后,表達式='{:\u300010}{:>15},中文空格\u3000和寬度10難以區分
(2){{:{2}<{1}}},價格從右對齊改成了左對齊
---應該是因為中文和價格數字的占位不同,所有向右對齊能解決空格補充問題,但是不能解決字符串本身的長度差異,所以向左對齊相對看起來比較整齊點
(3)遺留一個問題,怎么讓===...自適應表寬