以下是优化后的代码:
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 = * len(fieldName)
for data in bookData:
values = , 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 = max(max_widths, width)
# 打印表头
print("┌" + "─" * (max_widths + 2) + "┬" + "─" * (max_widths + 2) + "┬" +
"─" * (max_widths + 2) + "┬" + "─" * (max_widths + 2) + "┐")
print("│" + fieldName.center(max_widths + 2) + "│" +
fieldName.center(max_widths + 2) + "│" +
fieldName.center(max_widths + 2) + "│" +
fieldName.center(max_widths + 2) + "│")
print("├" + "─" * (max_widths + 2) + "┼" + "─" * (max_widths + 2) + "┼" +
"─" * (max_widths + 2) + "┼" + "─" * (max_widths + 2) + "┤")
# 打印数据
for data in bookData:
values = , 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 - 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) + " │"
elif i == 2:
row += " " * left_padding + value + " " * right_padding + " │"
else:
row += " " * left_padding + value + " " * right_padding + " │"
print(row)
# 打印表尾
print("└" + "─" * (max_widths + 2) + "┴" + "─" * (max_widths + 2) + "┴" +
"─" * (max_widths + 2) + "┴" + "─" * (max_widths + 2) + "┘")
代码解释:
最大宽度计算:借助 unicodedata.east_asian_width 函数算出每个字段的最大宽度,以此保证表格能容纳所有数据。
表头打印:按照最大宽度打印表头,并且用分隔线分隔表头和数据。
数据打印:依据每个字段的最大宽度和实际宽度,对数据进行填充和对齐,确保每列数据对齐。
表尾打印:按照最大宽度打印表尾。
通过上述步骤,能够保证表格中每列数据对齐输出。
页:
1
[2]