這個問題煩惱了挺久,通常狀況下我都是用\t解決,但其實這樣的辦法並非很nice,而後今天在寫一個demo的時候實在看不下去,就百度科普了一波,確實是有比較nice的解決方案。python
像這樣:字體
使人十分難受啊!編碼
#-------------------------------------------------------------------------------------------------spa
在此以前先說一下python中的.format格式化輸出code
python2.6開始,可使用str.format進行輕鬆的格式化,orm
如上能夠看到,對變量的處理簡潔靈活,此外對數字的各類位數處理也很到位blog
{:<x}的語法表示左對齊(>爲右對齊,^爲居中),少於x位自動補齊(默認爲空格補齊)utf-8
這裏值得注意的是,x也能夠做爲變量代入:字符串
#-----------------------------------------------------------------------------------------------------table
着手解決問題,
第一反應使用\t製表符,帶來的問題即是字符串長度差距超過一個製表位時,會跳到下一個製表位,如圖:
不能接受,使用str.format補齊name屬性的長度爲25
結果倒是這樣的:
py雖好,有些細節仍是沒有照顧到中文
這裏補齊長度時中文字符也按1字節計算了,
然而咱們知道,utf-8中中文佔用3個字節,GBK中佔用了2個字節,只算做1字節顯然不能對齊
這時求助於prettytable包輸出表格,然而輸出也不理想,能夠想象也沒有考慮中文編碼的問題(或是須要設置編碼爲utf-8或gbk?)
分析一下理想的name所佔的長度,應爲固定的x字節(這裏按目前的爬取結果暫時取22)
那麼他的補齊長度應爲
len = 22 - gbk編碼下name的字節數 + name的字符數
幸運的是str.format支持使用變量代替補齊長度的值
嘗試如下代碼:
print('[{name:<{len}}x'.format(name=name+']',len=22-len(name.encode('GBK'))+len(name)))
結果十分接近理想了:
仍是有一些迷之問題致使1-0.5字節長度的誤差,猜想是因爲中文字體不是等寬字體的緣故?
然而不用多慮,這裏就可使用一記粗暴的製表符\t解決問題了
print('[{name:<{len}}\tx'.format(name=name+']',len=22-len(name.encode('GBK'))+len(name)))
大功告成!