zoukankan      html  css  js  c++  java
  • python对齐输出

    这个问题烦恼了挺久,一般情况下我都是用 解决,但其实这样的办法并不是很nice,然后今天在写一个demo的时候实在看不下去,就百度科普了一波,确实是有比较nice的解决方案。

    像这样:

     

    令人十分难受啊!

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

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

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

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

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

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

     

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

    着手解决问题,

    第一反应使用 制表符,带来的问题便是字符串长度差距超过一个制表位时,会跳到下一个制表位,如图:

    不能接受,使用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字节长度的偏差,猜测是由于中文字体不是等宽字体的缘故?

    然而不用多虑,这里就可以使用一记粗暴的制表符 解决问题了

    print('[{name:<{len}}	x'.format(name=name+']',len=22-len(name.encode('GBK'))+len(name)))

    大功告成!

  • 相关阅读:
    bzoj 4897 天赋 有向图的矩阵数定理
    bzoj 4621 Tc605 思想+dp
    bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
    bzoj 4455 [Zjoi2016]小星星 树形dp&容斥
    获取Android设备无线和以太网MAC地址
    Java WebSocket库:https://github.com/TooTallNate/Java-WebSocket
    UsbManager, UsbDevice的简单示例
    Android开发之开机自动启动应用
    使用Microsoft Office 2007将文档转换为PDF
    C/C++实现删除字符串的首尾空格
  • 原文地址:https://www.cnblogs.com/nul1/p/11136495.html
Copyright © 2011-2022 走看看