糖醋咸鱼多放辣 2023-08-22 21:29 采纳率: 72.7%
浏览 53
已结题

请教一个Python打印对齐的问题

如图红线所示,为什么打印的结果没有上下对齐,代码逻辑哪里不对吗

img

def query_uid_gid_ugo():
    results = [['/thdfq_khsfb/pnc', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_khsfb/map', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_khsfb/percp', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_khsfb/model', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_khsfb/kznameq_bjzdkmmty', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_plt/hjadernk_service', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_plt/hjadernk', '600>>600>>555', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_plt/thdfqos', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/svp', '200>>200>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_hdmap', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_map/nzpmap', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_map/parkingmap', '600>>600>>777', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_para/bjzdkmmty', '700>>201>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_para/swk', '700>>201>>775', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_knvr/ota_cache', '200>>200>>775', 'uid/gid校验结果异常!预期值为700、201', 'FAILED'],
               ['/thdfq_knvr/logs', '600>>600>>777', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_knvr/mja', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_knvr/eqz', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/dsv_knvr', '200>>200>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/thdfq_rawknvr', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED']]
    return results


def formatted_print():
    headers = ["Skds/Public", "UID/GID/UGO", "DetailsInfo", "CheckResult"]
    data = query_uid_gid_ugo()

    column_widths = [max(len(str(row[i])) for row in data) for i in range(len(headers))]
    print(column_widths)

    header_line = "\t|\t".join(f"{headers[i]:<{column_widths[i]}}" for i in range(len(headers)))
    print(header_line)

    for row in data:
        row_line = "\t|\t".join(f"{str(item):<{column_widths[i]}}" for i, item in enumerate(row))
        print(row_line)


formatted_print()


出现其他情况格式更加错误

img

  • 写回答

13条回答 默认 最新

  • Marst·Writer 2023-08-23 11:49
    关注

    问题点: 为什么打印的结果没有上下对齐.
    分析思路:
    打印的问题从两方面着手:
    1.python3, print函数默认输出的编码为utf-8,但是在Python 3中,所有字符串默认都是Unicode编码,
    因此编码的不同,会导致统计的长度无效.(Unicode编码下的字符串长度对utf-8的编码有意义么?不含中文的情况下时,没问题)

    可以使用以下指令确认打印的输出编码

    import sys
    print(sys.stdout.encoding)
    

    比较含中文和不含中文的差异

    a = 'uid/gid/ugo校验结果正常!'
    print(len(a))  # 18
    print(len(a.encode('unicode_escape').decode()))  # 53
    
    b = "DetailsInfo"
    print(len(b))  # 11
    print(len(b.encode('unicode_escape').decode()))  # 11
    

    2.全角和半角的影响

    c = 'uid/gid校验结果异常!预期值为700、201'
    print(len(c))  # 25
    print(len(c.encode('unicode_escape').decode()))  # 85
    

    解决办法:
    将全部数据从全角转成半角, 并且转成Unicode编码.这时数据就变得一致了.
    缺点:虽然对齐了,中文在Unicode编码下是乱码.

    import unicodedata
    
    
    def query_uid_gid_ugo():
        results = [['/thdfq_khsfb/pnc', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_khsfb/map', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_khsfb/percp', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_khsfb/model', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_khsfb/kznameq_bjzdkmmty', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_plt/hjadernk_service', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_plt/hjadernk', '600>>600>>555', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_plt/thdfqos', '600>>600>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/svp', '200>>200>>550', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_hdmap', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_map/nzpmap', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_map/parkingmap', '600>>600>>777', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_para/bjzdkmmty', '700>>201>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_para/swk', '700>>201>>775', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_knvr/ota_cache', '200>>200>>775', 'uid/gid校验结果异常!预期值为700、201', 'FAILED'],
                   ['/thdfq_knvr/logs', '600>>600>>777', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_knvr/mja', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_knvr/eqz', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/dsv_knvr', '200>>200>>770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
                   ['/thdfq_rawknvr', '600>>600>>770', 'uid/gid/ugo校验结果正常!', 'PASSED']]
        return results
    
    # 全角转半角
    def full_to_half(text):
        return unicodedata.normalize('NFKC', text)
    
    
    def get_max_length(data, _column_widths):
        """
        params: data list
        """
        # _column_widths = [0, 0, 0, 0]
        data_list = []
        for _index, _text in enumerate(data):
            _text_new = full_to_half(_text)
            data_list.append(_text_new)
            # encode('unicode_escape') 将字符串转换为 Unicode 编码,decode() 将编码转换为字符串,
            # 并用 len() 函数计算长度。注意要减去 string.count("\\u"),以排除转义字符对长度的影响。
            text_width = len(_text_new.encode('unicode_escape').decode())  # - _text_new.count("\\u")
            if text_width > _column_widths[_index]:
                _column_widths[_index] = text_width
        return data_list
    
    
    def formatted_print():
        headers = ["Skds/Public", "UID/GID/UGO", "DetailsInfo", "CheckResult"]
        data = query_uid_gid_ugo()
        data.insert(0, headers)
        column_widths = [0, 0, 0, 0]
        # column_widths = [max(len(str(row[i])) for row in data) for i in range(len(headers))]
        data_new_list = []
        for _index, row in enumerate(data):
            _row = get_max_length(row, column_widths)
            data_new_list.append(_row)
    
        for _index, row_new in enumerate(data_new_list):
            row_line = "\t|\t".join(f"{item.encode('unicode_escape').decode():{(column_widths[i])}}" for i, item in enumerate(row_new))
    
            print(row_line)
        print(column_widths)
    
        # header_line = "\t|\t".join(f"{headers[i]:<{column_widths[i]}}" for i in range(len(headers)))
        # print(header_line)
    
    
    import sys
    print(sys.stdout.encoding)
    formatted_print()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 9月5日
  • 已采纳回答 8月28日
  • 修改了问题 8月23日
  • 赞助了问题酬金20元 8月22日
  • 展开全部

悬赏问题

  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口