汉字和ascii混合时如何控制输出格式?

it_*_*ure 4 python python-3.x

我发现很难使文本对齐.

table='''????,??,????
HuangTianhui,?,1948/05/28
???,?,1952/03/27
???,?,1994/12/09
LuiChing,?,1969/08/02
???,?,1982/03/01
???,?,1983/08/03
YangJiabao,?,1988/08/25
????·???,?,1979/07/10
???,?,1949/10/20
???(??),?,2011/02/25
(??????),?,1985/07/20
'''
data=[ [cell  for cell in row.split(",") ] for row in table.split("\n")  if row]
len0=max([ len(x[0])   for x in data])
len1=max([ len(x[1])   for x in data])
len2=max([ len(x[2])   for x in data])

for cell in data:
    print("_"*((len0+len1+len2)*2+4) )
    print("|%24s|%4s|%20s|" % (cell[0],cell[1],cell[2]))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

不是每一行都是(12 + 2 + 10)*2 + 4字符宽度,相同的格式控制语句,但不同的输出,我如何修复它使每一行相同的输出格式,相同的宽度?

Rob*_*obᵩ 5

您可以考虑字符串中的全宽与半宽字符数:

#!/usr/bin/python3
# coding=utf8

import unicodedata

def wide_chars(s):
    return sum(unicodedata.east_asian_width(x)=='W' for x in s)
def width(s):
    return len(s) + wide_chars(s)

table='''????,??,????
HuangTianhui,?,1948/05/28
???,?,1952/03/27
???,?,1994/12/09
LuiChing,?,1969/08/02
???,?,1982/03/01
???,?,1983/08/03
YangJiabao,?,1988/08/25
????·???,?,1979/07/10
???,?,1949/10/20
???(??),?,2011/02/25
(??????),?,1985/07/20
'''
data=[ [cell  for cell in row.split(",") ] for row in table.split("\n")  if row]
len0=max([ width(x[0])   for x in data])
len1=max([ width(x[1])   for x in data])
len2=max([ width(x[2])   for x in data])

for cell in data:
    print("_"*((len0+len1+len2)*2+4) )
    print("|%*s|%*s|%*s|" % (24-wide_chars(cell[0]), cell[0],
                               4-wide_chars(cell[1]),cell[1],
                               20-wide_chars(cell[2]), cell[2]))
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述