鱼C论坛

 找回密码
 立即注册
查看: 74|回复: 3

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

[复制链接]
发表于 前天 16:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的代码是这样的:

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 前天 16:03 | 显示全部楼层
1      资本论(第一卷)   人民出版社       90
    2     中华人民共和国简史  上海人民出版社      40
    3      百年大党正年轻    东方出版社       68
    4     零基础学Python3.0(全彩版) 吉林大学出版社    79.80
    5     给Python点颜色 青少年学编程 人民邮电出版社    59.80
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 19:40 | 显示全部楼层
首先,你给出的宽度太小,尝试增大宽度:
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(' ',' '))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 前天 22:53 | 显示全部楼层
你也可以利用第三方库 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 = [12, 35, 25, 12]
print("".join(adjust_text(fieldName[i], widths[i], align='center') for i in range(len(fieldName))))
for each in bookData:
    print("".join(adjust_text(each[k], widths[i], align='center') for i, k in enumerate(["id", "bookName", "publisher", "Price"])))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-23 21:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表