1. 从一份“歪掉”的报表说起printTable 到底解决什么问题如果你手头有一堆嵌套列表数据比如从日志里抽出来的字段、从接口返回里拼出来的统计结果直接print出来的效果大概率是“能看但没法看”。列与列之间全靠空格硬撑短字符串和长字符串混在一起眼睛根本对不齐。Python 编程快速上手第 6 章实践项目里的 printTable 函数练的就是这个场景把嵌套列表按列宽自动对齐输出一张规整的文本表格。它适合谁适合刚学完列表和循环、想找一个“有实际产出”的练手项目的人也适合日常要做自动化办公、需要把数据快速打印成可读报表的开发者。核心检索词就三个Python、printTable、表格打印。你不需要装任何第三方库标准库的len、rjust、ljust就够用。我先把结论放前面printTable 的难点不在打印而在“列宽计算”和“行列转置”这两个容易写反的地方。下面从环境准备开始一步步把可复制的代码、参数含义、验证步骤和排错清单全部给出来。2. TaoToken 前置给 printTable 配一个顺手的模型对话入口写这种小函数最烦的不是逻辑而是卡在一个IndexError上半天想不通。我的习惯是旁边开一个模型对话窗口把报错和代码贴进去让它帮我定位。TaoToken 的模型对话入口可以直接用地址是https://taotoken.net/api对话页面的 deep link 是https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite。如果你只是偶尔问几句用模型对话就够了如果你打算长期写 Python 自动化脚本、甚至接 Agent 做批量任务可以看下 Coding Plan入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite。需要自己写脚本调用接口的话先去控制台建 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite然后在 API Keys 页面拿到密钥https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite。这里要提醒一句TaoToken 是模型调用入口不是编辑器替代品。printTable 的代码还是在你本地的 PyCharm、VS Code 或者 Jupyter 里跑模型对话只负责帮你答疑和排错。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite里面有完整的请求格式说明。3. 可复制配置printTable 完整代码与列宽计算逻辑3.1 原始数据与目标输出先看项目给的测试数据tableData [ [apples, oranges, cherries, banana], [Alice, Bob, Carol, David], [dogs, cats, moose, goose] ]注意这是一个“行优先”的嵌套列表tableData[0]是水果行tableData[1]是人名行tableData[2]是动物行。但我们要打印的表格是每一列对应一个“人”的完整信息也就是需要把行列转置过来看。这是第一个坑很多人直接按tableData[i][j]打印结果列宽算对了顺序却全乱了。3.2 列宽计算为什么是 cloWidths[i] 而不是 cloWidths[j]列宽列表的初始化是cloWidths [0] * len(input_list)长度等于行数。因为转置之后原来的“行”变成了“列”所以每一行的最大字符串长度就是对应列的宽度。cloWidths [0] * len(input_list) for i in range(len(input_list)): for j in range(len(input_list[i])): if cloWidths[i] len(input_list[i][j]): cloWidths[i] len(input_list[i][j])这段逻辑用大白话说外层i遍历每一行内层j遍历这一行里的每个字符串只要发现当前字符串比记录的最大宽度还长就更新cloWidths[i]。跑完tableData之后cloWidths应该是[8, 5, 5]分别对应cherries、Alice、moose的长度。3.3 打印逻辑rjust 与 ljust 的分工打印部分最容易写错的是索引。转置后第i列的第j个元素其实是input_list[j][i]。所以循环要写成for i in range(len(input_list[0])): for j in range(len(input_list)): if j 0: print(input_list[j][i].rjust(cloWidths[j]), end ) elif j 1: print(input_list[j][i].ljust(cloWidths[j]), end ) else: print(input_list[j][i].ljust(cloWidths[-1]), end\n)第一列用rjust右对齐后面两列用ljust左对齐这是为了让数字列或短列看起来更整齐。end 控制列间空格最后一列用end\n换行。完整函数如下def printTable(input_list): cloWidths [0] * len(input_list) for i in range(len(input_list)): for j in range(len(input_list[i])): if cloWidths[i] len(input_list[i][j]): cloWidths[i] len(input_list[i][j]) for i in range(len(input_list[0])): for j in range(len(input_list)): if j 0: print(input_list[j][i].rjust(cloWidths[j]), end ) elif j 1: print(input_list[j][i].ljust(cloWidths[j]), end ) else: print(input_list[j][i].ljust(cloWidths[-1]), end\n)4. 验证请求与成功结果三组测试数据实测对齐效果4.1 第一组项目原始数据直接调用printTable(tableData)预期输出apples Alice dogs oranges Bob cats cherries Carol moose banana David goose注意第一列apples前面有两个空格因为cherries长度是 8apples只有 6rjust会补两个空格。这就是列宽计算生效的直接证据。4.2 第二组加入中文与数字混合中文的len在 Python 里按字符数算一个汉字算 1但终端显示宽度通常是 2。如果你直接套用中文列会歪。测试数据tableData2 [ [姓名, 年龄, 城市], [张三, 28, 北京], [李四四, 9, 上海] ]跑出来会发现“姓名”列宽度按 3 算但显示时占 6 格后面就错位了。解决办法是用unicodedata.east_asian_width判断宽字符把宽度乘 2。这是原书没展开、但实际办公场景一定会踩的坑。4.3 第三组空字符串与超长字段tableData3 [ [id, name, description], [1, a, short], [2, bb, a very long description here] ]cloWidths会取到description列的最大长度 27前两行该列会用ljust补空格到 27。输出时右侧会有一大片空白这是正常的因为文本表格没有自动换行能力。如果你要打印到日志建议先截断超长字段或者改用textwrap做折行。5. 本篇常见错排查IndexError、列宽错位与中文对齐5.1 IndexError: list index out of range最常见的原因是打印循环写成了for i in range(len(input_list))外层、for j in range(len(input_list[i]))内层但访问时用了input_list[i][j]而不是input_list[j][i]。当各行长度不一致时input_list[i][j]就会越界。记住转置访问是[j][i]外层循环上限是len(input_list[0])。5.2 列宽算对了但输出还是歪的检查end参数。如果所有列都用end 最后一行不会换行光标停在行尾如果最后一列也用end 下一行会接着打印。另外rjust和ljust用反了也会导致视觉错位第一列通常右对齐文本列左对齐。5.3 中文表格对不齐前面提过len(张三)返回 2但终端里占 4 格。修复思路是写一个display_width函数import unicodedata def display_width(s): width 0 for ch in s: if unicodedata.east_asian_width(ch) in (F, W): width 2 else: width 1 return width然后把len(input_list[i][j])换成display_width(input_list[i][j])rjust/ljust也要换成按显示宽度补空格的自定义函数。这一步做完中文报表才能真正对齐。5.4 数据行数不一致导致漏打如果tableData里某一行比其他行短转置后会出现None或直接跳过。稳妥做法是先统一各行长度用空字符串补齐max_len max(len(row) for row in tableData) for row in tableData: row.extend([] * (max_len - len(row)))这样再跑 printTable就不会因为某行缺列而报错。6. 把 printTable 接进你的自动化流程printTable 本身只有十几行但它背后的“列宽计算 转置打印”思路可以直接迁移到日志整理、CSV 预览、接口返回格式化等场景。如果你在写更复杂的自动化脚本时卡住了可以到模型对话里贴代码问https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite。需要批量跑脚本、接 Agent 做长期任务的看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite。自己写调用脚本的Key 在 API Keys 页面拿https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite接入格式参考文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentprinttable_articleutm_campaignrewrite。最后留一个实用技巧把 printTable 保存成print_table.py在别的脚本里from print_table import printTable就能复用。如果你经常打印中文表格记得把display_width版本一起带上否则每次都要重新调对齐。
企业数字化 ERP 产品动态
相关推荐
网站推广对接图解步骤:新手避坑全记录 网站推广对接图解步骤:新手避坑全记录 手里攥着预算,心里没底?很多刚入行做网站的朋友,甚至包括那些想自己搞个展示站的外行,最头疼的就是 网站推广对接… · 2026/9/27 20:49:30
不会代码可以做网站维护吗?看完这5步完整流程不再被坑 不会代码可以做网站维护吗?看完这5步完整流程不再被坑 找建站公司最怕什么?怕被忽悠花大价钱,最后连个改字都要收维护费。很多新手老板心里犯嘀咕:我连代码都看不懂,还能自己搞定网站维护吗?别急,只要掌握这套 完整流程… · 2026/9/27 20:49:30
deepsec 批处理提示词组装解析:INFO.md 与 promptAppend 的注入位置及防重复机制 应用安全漏洞扫描人工智能AI Agent 【免费下载链接】deepsec Deepsec is a security harness for finding vulnerabilities in your codebase powered by coding agents 项目地址: https://gitcode.com/gh_mirrors/deeps/deepsec 点击查看 免费下载 Deepsec 在将扫… · 2026/9/27 21:22:26
SVG-Edit 事件系统实战指南:从自定义保存处理器到 Canvas 事件绑定 前端图形学 【免费下载链接】svgedit Powerful SVG-Editor for your browser 项目地址: https://gitcode.com/gh_mirrors/sv/svgedit 点击查看 免费下载 导读
本文基于 SVG-Edit 官方教程 docs/tutorials/Events.md,系统梳理 SVG-Edit 的完整事件体系&… · 2026/9/27 21:22:26
接网站开发私活如何签合同进阶技巧 接网站开发私活如何签合同避坑指南含免费工具 找建站公司怕被坑高价?接私活最怕合同模糊导致返工扯皮,用这款免费工具核对条款能省一半心机。 威胁场景:合同模糊引发的信任崩塌… · 2026/9/27 21:22:13
Windows 远程控制 Linux 实战:TaoToken 统一 Key 打通 AI 终端配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 21:22:13
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01