淺談python str.format與制表符\t關(guān)于中文對齊的細(xì)節(jié)問題
寫了一個練手的爬蟲...在輸出的時候出現(xiàn)了讓人很不愉♂悅的問題
像這樣:
令人十分難受??!
#------------------------------------------
在此之前先說一下python中的.format格式化輸出
python2.6開始,可以使用str.format進(jìn)行輕松的格式化,
如上可以看到,對變量的處理簡潔靈活,此外對數(shù)字的各種位數(shù)處理也很到位
{:<x}的語法表示左對齊(>為右對齊,^為居中),少于x位自動補(bǔ)齊(默認(rèn)為空格補(bǔ)齊)
這里值得注意的是,x也可以作為變量代入:
#------------------------------------------
著手解決問題,
第一反應(yīng)使用\t制表符,帶來的問題便是字符串長度差距超過一個制表位時,會跳到下一個制表位,如圖:
不能接受,使用str.format補(bǔ)齊name屬性的長度為25
結(jié)果卻是這樣的:
py雖好,有些細(xì)節(jié)還是沒有照顧到中文
這里補(bǔ)齊長度時中文字符也按1字節(jié)計算了,
然而我們知道,utf-8中中文占用3個字節(jié),GBK中占用了2個字節(jié),只算作1字節(jié)顯然不能對齊
這時求助于prettytable包輸出表格,然而輸出也不理想,可以想象也沒有考慮中文編碼的問題(或是需要設(shè)置編碼為utf-8或gbk?)
分析一下理想的name所占的長度,應(yīng)為固定的x字節(jié)(這里按目前的爬取結(jié)果暫時取22)
那么他的補(bǔ)齊長度應(yīng)為
len = 22 - gbk編碼下name的字節(jié)數(shù) + name的字符數(shù)
幸運的是str.format支持使用變量代替補(bǔ)齊長度的值
嘗試以下代碼:
print('[{name:<{len}}x'.format(name=name+']',len=22-len(name.encode('GBK'))+len(name)))
結(jié)果十分接近理想了:
還是有一些迷之問題導(dǎo)致1-0.5字節(jié)長度的偏差,猜測是由于中文字體不是等寬字體的緣故?
然而不用多慮,這里就可以使用一記粗暴的制表符\t解決問題了
print('[{name:<{len}}\tx'.format(name=name+']',len=22-len(name.encode('GBK'))+len(name)))
大功告成!鏘鏘!
#------------------------------------------
后話
這次寫的主要是一個爬取幾個主要交易網(wǎng)站以及steam上dota2飾品價格的爬蟲,里面遇到的問題其實也挺多的比如登錄動態(tài)加載等等
等寫的比較完善了大概也會一起發(fā)上來啦~
以上這篇淺談python str.format與制表符\t關(guān)于中文對齊的細(xì)節(jié)問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決python訪問報錯:jinja2.exceptions.TemplateNotFound:index.html
這篇文章主要介紹了解決python訪問報錯:jinja2.exceptions.TemplateNotFound:index.html,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12如何利用python實現(xiàn)詞頻統(tǒng)計功能
詞頻統(tǒng)計用途很廣泛,比如我們統(tǒng)計某篇文章中的用詞頻率,網(wǎng)絡(luò)熱點詞匯,再比如起名排行榜呀、熱門旅游景點排行榜呀什么的,其實也都可以套用,這篇文章主要給大家介紹了關(guān)于如何利用python實現(xiàn)詞頻統(tǒng)計功能的相關(guān)資料,需要的朋友可以參考下2021-10-10Python中使用dwebsocket實現(xiàn)后端數(shù)據(jù)實時刷新
dwebsocket是Python中一款用于實現(xiàn)WebSocket協(xié)議的庫,可用于后端數(shù)據(jù)實時刷新。在Django中結(jié)合使用dwebsocket和Channels,可以實現(xiàn)前后端的實時通信,支持雙向數(shù)據(jù)傳輸和消息推送,適用于實時聊天、數(shù)據(jù)監(jiān)控、在線游戲等場景2023-04-04