player-none 发表于 2025-3-20 20:53:16

效果图显示不出来

帅哥520 发表于 2025-3-23 13:06:25

不会

Tyroe 发表于 2025-3-29 21:42:06

你期望每列数据对齐输出,问题在于中文字符和英文字符在宽度上有差异,这会影响对齐效果。可以借助 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 = * 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]
查看完整版本: 萌新求助,如何让每列的数据对齐输出呢?