|
你期望每列数据对齐输出,问题在于中文字符和英文字符在宽度上有差异,这会影响对齐效果。可以借助 unicodedata 模块来计算字符的宽度,进而实现对齐。
以下是优化后的代码:
import unicodedata
fieldName = ("商品id", "图书名称", "出版社", "价格")
bookData = (
{"id": "1", "bookName": "资本论(第一卷)",
"publisher": "人民出版社", "Price": "90"},
{"id": "2", "bookName": "中华人民共和国简史",
"publisher": "上海人民出版社", "Price": "40"},
{"id": "3", "bookName": "百年大党正年轻",
"publisher": "东方出版社", "Price": "68"},
{"id": "4", "bookName": "零基础学Python3.0(全彩版)",
"publisher": "吉林大学出版社", "Price": "79.80"},
{"id": "5", "bookName": "给Python点颜色 青少年学编程",
"publisher": "人民邮电出版社", "Price": "59.80"},
)
# 计算每个字段的最大宽度
max_widths = [0] * len(fieldName)
for data in bookData:
values = [data['id'], data['bookName'], data['publisher'], data['Price']]
for i, value in enumerate(values):
width = sum(2 if unicodedata.east_asian_width(c) in 'FW' else 1 for c in value)
max_widths[i] = max(max_widths[i], width)
# 打印表头
print("┌" + "─" * (max_widths[0] + 2) + "┬" + "─" * (max_widths[1] + 2) + "┬" +
"─" * (max_widths[2] + 2) + "┬" + "─" * (max_widths[3] + 2) + "┐")
print("│" + fieldName[0].center(max_widths[0] + 2) + "│" +
fieldName[1].center(max_widths[1] + 2) + "│" +
fieldName[2].center(max_widths[2] + 2) + "│" +
fieldName[3].center(max_widths[3] + 2) + "│")
print("├" + "─" * (max_widths[0] + 2) + "┼" + "─" * (max_widths[1] + 2) + "┼" +
"─" * (max_widths[2] + 2) + "┼" + "─" * (max_widths[3] + 2) + "┤")
# 打印数据
for data in bookData:
values = [data['id'], data['bookName'], data['publisher'], data['Price']]
row = "│"
for i, value in enumerate(values):
width = sum(2 if unicodedata.east_asian_width(c) in 'FW' else 1 for c in value)
padding = max_widths[i] - width
left_padding = padding // 2
right_padding = padding - left_padding
if i == 0:
row += " " * left_padding + value + " " * right_padding + " │"
elif i == 1:
row += " " + value.ljust(max_widths[i]) + " │"
elif i == 2:
row += " " * left_padding + value + " " * right_padding + " │"
else:
row += " " * left_padding + value + " " * right_padding + " │"
print(row)
# 打印表尾
print("└" + "─" * (max_widths[0] + 2) + "┴" + "─" * (max_widths[1] + 2) + "┴" +
"─" * (max_widths[2] + 2) + "┴" + "─" * (max_widths[3] + 2) + "┘")
代码解释:
最大宽度计算:借助 unicodedata.east_asian_width 函数算出每个字段的最大宽度,以此保证表格能容纳所有数据。
表头打印:按照最大宽度打印表头,并且用分隔线分隔表头和数据。
数据打印:依据每个字段的最大宽度和实际宽度,对数据进行填充和对齐,确保每列数据对齐。
表尾打印:按照最大宽度打印表尾。
通过上述步骤,能够保证表格中每列数据对齐输出。 |
|