python str.format与制表符t关于中文对齐的细节问题 - Go语言中文社区

python str.format与制表符t关于中文对齐的细节问题


写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题

像这样:

令人十分难受啊!

#-------------------------------------------------------------------------------------------------

在此之前先说一下python中的.format格式化输出

python2.6开始,可以使用str.format进行轻松的格式化,

如上可以看到,对变量的处理简洁灵活,此外对数字的各种位数处理也很到位

{:<x}的语法表示左对齐(>为右对齐,^为居中),少于x位自动补齐(默认为空格补齐)

这里值得注意的是,x也可以作为变量代入:


#-----------------------------------------------------------------------------------------------------

着手解决问题,

第一反应使用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)))


大功告成!锵锵!

#------------------------------------------------------------------------

后话

这次写的主要是一个爬取几个主要交易网站以及steam上dota2饰品价格的爬虫,

里面遇到的问题其实也挺多的比如登录动态加载等等

等写的比较完善了大概也会一起发上来啦

(话说前一天晚上写完这个爬虫,第二天凌晨c5就炸了......怕不是我拥有了东方的神秘力量....


版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/excaliburrr/article/details/76794451
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 10:24:34
  • 阅读 ( 997 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢