2993554205 发表于 2025-2-21 16:02:46

如何实现每列对齐打印数据呢?

我的代码是这样的:

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"},
)
for each in bookData:
    print("{:^10}{:^10}{:^10}{:^10}".format((each['id']),(each['bookName']),(each['publisher']),(each["Price"])))
但是结果是这样的:
1      资本论(第一卷)   人民出版社       902   中华人民共和国简史上海人民出版社      403      百年大党正年轻    东方出版社       684   零基础学Python3.0(全彩版) 吉林大学出版社    79.805   给Python点颜色 青少年学编程 人民邮电出版社    59.80


2993554205 发表于 2025-2-21 16:03:23

1      资本论(第一卷)   人民出版社       90
    2   中华人民共和国简史上海人民出版社      40
    3      百年大党正年轻    东方出版社       68
    4   零基础学Python3.0(全彩版) 吉林大学出版社    79.80
    5   给Python点颜色 青少年学编程 人民邮电出版社    59.80

smallwh 发表于 2025-2-21 19:40:53

首先,你给出的宽度太小,尝试增大宽度:
for each in bookData:
    print("{:^5}{:^20}{:^15}{:^6}".format(each['id'],each['bookName'],each['publisher'],each["Price"]))

其次,一个中文字符与一个英文字符显示出来的 宽度/大小 不同,中文字符明显要 宽/大 ,这就注定了不可能简单地让它对的非常齐。
1      资本论(第一卷)         人民出版社       90
2       中华人民共和国简史          上海人民出版社      40
3      百年大党正年轻            东方出版社       68
4   零基础学Python3.0(全彩版)   吉林大学出版社    79.80
5   给Python点颜色 青少年学编程      人民邮电出版社    59.80
这就是修改后的效果,对的齐了一些。

但如果追求完美的话,建议将英文字母、标点、空格全部替换为相应的全角字符:
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"},
)
for each in bookData:
    print("{:^5}{:^20}{:^15}{:^6}".format(each['id'],each['bookName'],each['publisher'],each["Price"]).replace(' ',' '))

小甲鱼的二师兄 发表于 2025-2-21 22:53:16

你也可以利用第三方库 wcwidth 来计算字符串的实际显示宽度,然后根据缺失的宽度手动填充空格。示例代码:

import wcwidth

def adjust_text(text, total_width, align='center'):
    # 计算实际显示宽度
    actual_width = sum(wcwidth.wcwidth(c) for c in text)
    # 根据对齐方式计算左右填充空格数
    if total_width <= actual_width:
      return text
    pad_total = total_width - actual_width
    if align == 'left':
      return text + ' ' * pad_total
    elif align == 'right':
      return ' ' * pad_total + text
    else:# center
      left_pad = pad_total // 2
      right_pad = pad_total - left_pad
      return ' ' * left_pad + text + ' ' * right_pad

# 示例:为每列设置 desired_width
widths =
print("".join(adjust_text(fieldName, widths, align='center') for i in range(len(fieldName))))
for each in bookData:
    print("".join(adjust_text(each, widths, align='center') for i, k in enumerate(["id", "bookName", "publisher", "Price"])))
页: [1]
查看完整版本: 如何实现每列对齐打印数据呢?