吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 799|回复: 22
收起左侧

[求助] 请教一个Python格式化打印中文字符无法上下对齐的问题

[复制链接]
chlryg 发表于 2023-8-25 20:32
[Python] 纯文本查看 复制代码
from collections import Counter


def query_uid_gid_ugo():
    results = [['/thdfq_khsfb/pnc', '600  600  550', 'uid/gid/ugohjdafhsafhndsmbhj', 'PASSED'],
               ['/thdfq_knvr/ota_cache', '200  200  775', 'uid/gid校验结果异常!预期值为200、307', 'FAILED'],
               ['/thdfq_para/swk', '700  201  775', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/dsv_knvr', '200  200  770', 'uid/gid/ugo校验结果正常!', 'PASSED'],
               ['/dxgmr', '200  200  770', 'uid/gid/ugo校验异常!预期值为907、600、301', 'PASSED'],
               ['/thdfq_knvr/logs', '600  600  777', 'uid/gid/ugo校验结果异常!预期值为1000、500、755', 'FAILED']]
    return results


def formatted_print():
    headers = ["Partitions", "UID/GID/UGO", "DetailsInfo", "CheckResult"]
    data = query_uid_gid_ugo()
    counter = Counter(row[-1] for row in data)

    # 计算每列最大宽度
    column_widths = [max(len(item) for item in column) for column in zip(headers, *data)]

    # 打印表格
    header_line = "+".join("-" * (width + 2) for width in column_widths)
    print(f"+{header_line}+")
    print("| " + " | ".join(f"{header:^{width}}" for header, width in zip(headers, column_widths)) + " |")
    print(f"+{header_line}+")
    for index, row in enumerate(data):
        formatted_row = "| " + " | ".join(f"{item:^{width}}" for item, width in zip(row, column_widths)) + " |"
        if row[-1] == "FAILED":
            print(f"\033[96m{formatted_row}\033[0m")
        else:
            print(formatted_row)
    print(f"+{header_line}+")

    # 统计结果
    print(f"校验完成,{counter['PASSED']}个目录访问权限状态正常,共计发现{counter['FAILED']}处异常。")


formatted_print()
mmexport1692966528184.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| chlryg 发表于 2023-8-25 20:35
如图所示,打印的结果,中文字符的宽度导致上下的分隔符没有对齐,请教各位大佬,如何修改可以解决此问题

点评

为啥要造轮子,试试第三方库tabulate  发表于 2023-8-25 23:19
axin1999 发表于 2023-8-25 21:36
用字符串的center,ljust,rjust对齐,不够的用空白填充
hrpzcf 发表于 2023-8-25 22:17
sai609 发表于 2023-8-26 07:50
同问同求:pycharm跑代码出来以后的结果,上下行不对齐,该咋整
lookfeiji 发表于 2023-8-26 08:14
百度搜一下函数原型,结果很多的print('%-3s '%(‘占位字符%-3s,字符型空三个字节,减号字符左对齐;sep不加空格,end不加换行符\n’),sep='',end='')
 楼主| chlryg 发表于 2023-8-27 01:43
axin1999 发表于 2023-8-25 21:36
用字符串的center,ljust,rjust对齐,不够的用空白填充

不管用,目前用的就是f-string的填充,但是中文字符宽度和英文不一样,是这个原因导致的,字符串方法不得行
 楼主| chlryg 发表于 2023-8-27 01:46
chlryg 发表于 2023-8-25 20:35
如图所示,打印的结果,中文字符的宽度导致上下的分隔符没有对齐,请教各位大佬,如何修改可以解决此问题

不是我想造轮子,是脚本运行环境不支持安第三方库,封闭的
 楼主| chlryg 发表于 2023-8-27 01:48
lookfeiji 发表于 2023-8-26 08:14
百度搜一下函数原型,结果很多的print('%-3s '%(‘占位字符%-3s,字符型空三个字节,减号字符左对齐;sep不 ...

没看明白  方便用两个字符串(一个纯英文一个中英混杂)来举例说明吗
sakura32 发表于 2023-8-27 11:08
本人小白,稍微试了一下,先分别找出所有字符串中最多的全角字符与半角字符个数,然后给每个字符串中插入它自身的全半角字符数与最多全半角字符数的差额的全半角空格
[Python] 纯文本查看 复制代码
import unicodedata

results = [['uid/gid/ugohjdafhsafhndsmbhj'],
           ['uid/gid校验结果异常!预期值为200、307'],
           ['uid/gid/ugo校验结果正常!'],
           ['uid/gid/ugo校验结果正常!'],
           ['uid/gid/ugo校验异常!预期值为907、600、301'],
           ['uid/gid/ugo校验结果异常!预期值为1000、500、755']]


def is_fullwidth(char):
    return unicodedata.east_asian_width(char) == 'W'


max_len_eng = 0
max_len_chs = 0
for i in results:
    len_i_eng = 0
    len_i_chs = 0
    for n in i[0]:
        if is_fullwidth(n) or n == '!':
            len_i_chs += 1
        else:
            len_i_eng += 1
    if len_i_eng > max_len_eng:
        max_len_eng = len_i_eng
    if len_i_chs > max_len_chs:
        max_len_chs = len_i_chs

for i in results:
    len_i_eng = 0
    len_i_chs = 0
    for n in i[0]:
        if is_fullwidth(n) or n == '!':
            len_i_chs += 1
        else:
            len_i_eng += 1

    print('|', '|'.join(i), ' ' * (max_len_eng - len_i_eng), ' ' * (max_len_chs - len_i_chs), '|')

效果如下,可以在加一个步骤,判断所有字符串插入的空格数,去除共同的最小全半角空格数
QQ截图20230827110153.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表