
个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化[TOC](《超简单用 Python 让 Excel 飞起来》读书笔记2.2.3 数据类型查询type() 排错法)1. 2.2.3 数据类型查询type() 排错法读书笔记定位本文是我阅读《超简单用 Python 让 Excel 飞起来》时整理的学习笔记重点不是照搬原书而是把type()这个基础函数放到Python Excel 办公自动化排错场景里重新理解。学完int、float、str这些基础类型后很快就会遇到一个现实问题数据表面看起来像数字、日期、文本但 Python 真正拿到的类型可能和我们以为的完全不是一回事。尤其是做 Excel 自动化时这个问题会被放大。比如 Excel 单元格里显示的是1200但 Python 读出来可能是字符串1200单元格看起来是空的读出来可能是None原本想做数字相加最后却变成了字符串拼接。所以这一节真正要掌握的不只是 type() 的语法而是用它建立一种排错习惯先确认数据类型再决定下一步处理方式。这张图展示的是type()在 Python Excel 自动化排错中的整体定位它不是复杂工具而是一个能快速看穿变量真实类型的小函数。从图中可以看出123、123.0、123、None虽然表面都像“数据”但在 Python 眼里分别对应int、float、str、NoneType。**很多 Excel 自动化脚本出错不是因为代码语法错了而是因为数据类型和预期不一致。**2. type() 是什么type()是 Python 的内置函数用来查看一个对象的真实类型。它的使用方式非常简单把变量放进type()里再打印出来。x10print(type(x))输出结果通常是这样的class int我更愿意把它理解成一句话别猜直接让 Python 告诉我这个变量到底是什么。这张图展示的是type()的基础作用通过一个函数把常见数据类型直接识别出来。从图中能看出type()的价值不在于“看起来高级”而在于它能把模糊感觉变成明确判断。123是整数123.0是小数Hello是字符串None是空值。对新手来说这一步很基础对写脚本排错来说这一步很关键。注意type() 适合用来观察和调试但不要把它理解成万能的数据清洗方案。它只能告诉我们当前对象是什么类型不能自动帮我们判断这个值是否合理更不能自动完成类型转换。3. 最常见的类型查询示例先看几个最基础的例子。不要觉得简单后面处理 Excel 表格、批量汇总、自动填报时这些基础判断会反复出现。3.1 查询整数 inta100print(a,type(a))输出结果100 class intint表示整数常见于数量、行号、计数、年份等场景。比如统计设备数量、工单数量、库存数量时通常就是整数类型。3.2 查询小数 floatb19.9print(b,type(b))输出结果19.9 class floatfloat表示浮点数也就是带小数点的数字。金额、比例、平均值、耗时统计经常会用到这种类型。3.3 查询字符串 strcExcel自动化print(c,type(c))输出结果Excel自动化 class strstr表示字符串。文件路径、表名、列名、员工姓名、部门名称大多数都是字符串。3.4 查询空值 NoneTypevalueNoneprint(value,type(value))输出结果None class NoneType看到 NoneType就要立刻警惕这个值可能来自空单元格不能直接做加法、拼接、格式化计算。这几个例子看起来简单但它们就是后面排查 Excel 数据异常的基础。很多时候我们不是不会写循环也不是不会读 Excel而是没有先确认每个字段到底是什么类型。4. 为什么 type() 在 Excel 自动化里特别重要做 Python 基础练习时变量通常是我们自己写死的所以类型比较可控。但一旦进入 Excel 自动化数据来源就复杂了表格是别人填的格式可能被复制粘贴污染数字可能被当成文本保存日期可能被 Excel 转成序列号空白单元格也可能被读取成不同的空值形式。这时候最危险的不是代码直接报错而是代码不报错但结果错了。因为报错至少会提醒你停下来排查而错误结果如果悄悄写回 Excel后面可能影响整张报表。4.1 看起来像数字其实是字符串比如下面这个例子money11200money2300print(money1money2)print(type(money1),type(money2))输出结果1200300 class str class str这不是数学相加而是字符串拼接。1200 300的结果不是1500而是1200300。这张图展示的就是 Excel 自动化里最常见的类型误判问题数据看起来像数字不代表 Python 真的把它当数字处理。从图中可以看到同样是来自 Excel 的数据1200是字符串1200是整数10.0是浮点数空白单元格可能是None。这说明 Excel 显示效果和 Python 数据类型之间不能直接画等号必须通过 type() 做一次确认。正确处理时要先确认类型再根据业务含义决定是否转换money11200money2300print(money1,type(money1))print(money2,type(money2))money1int(money1)money2int(money2)print(money1money2)输出结果1200 class str 300 class str 15004.2 空单元格带来的 NoneType 问题另一个常见场景是空单元格。如果你没有提前判空后面直接做计算就很容易报错。valueNone# 错误示例None 不能直接参与数字运算resultvalue100更稳的写法应该是先判断valueNoneifvalueisNone:value0resultvalue100print(result)推荐做法从 Excel 读取数据后先抽样打印几个关键字段的值和类型再决定是否需要转换、清洗或判空。4.3 日期字段也不要轻易相信肉眼Excel 里的日期也很容易迷惑人。单元格里显示为2026/05/30Python 读出来可能是日期对象也可能是字符串也可能是 Excel 内部的序列值。这取决于你使用的库、单元格格式以及数据来源。所以遇到日期字段也建议先打印print(value,type(value))日期字段的排查原则和数字字段一样先确认真实类型再决定是格式化显示、字符串处理还是转换成日期对象。5. type() print()我最常用的排错组合拳我写 Python 脚本时遇到结果不对第一反应通常不是马上改代码而是先打印变量和类型。print(value,type(value))这句代码看起来很普通但现场排错非常实用。它可以同时告诉我两个信息变量当前的值是什么以及 Python 把它识别成什么类型。这张图展示的是type() print()组合拳先把值打印出来再把类型打印出来从而快速定位问题。从图中能看出123、19.9、Excel、None的值和类型被放在一起观察。这个习惯很重要因为很多时候只看值会误判只看类型又不知道数据内容两个一起看才完整。比如下面这个例子我想计算金额但结果不对value1200print(value,type(value))# 看到是 str 后再做转换valueint(value)print(value,type(value))输出结果1200 class str 1200 class int这个过程本质上就是先确认问题再做处理最后再次验证。这比一上来就盲目转换要稳得多。如果变量比较多也可以把字段名一起打印出来这样排错时更容易定位是哪一列出了问题name金额value1200print(name,value,type(value))输出结果金额 1200 class str这个小习惯非常适合 Excel 自动化排错字段名、字段值、字段类型一起看。6. type() 排障流程不要凭感觉改代码真正写脚本时我不建议看到报错就马上复制搜索结果。更稳的方式是按照一个固定流程排查先看值再看类型再判断是否符合预期然后再决定转换、清洗还是判空。这张图展示的是type()的排障流程发现结果异常后不是直接乱改而是按步骤确认数据状态。从图中能看出一个稳定的排错路径应该是发现异常 → 查看值和类型 → 判断类型是否符合预期 → 做转换、清洗、判空 → 再次验证。**这套流程适合所有 Excel 自动化脚本不只适合 type() 这一节。**我把这个流程再整理成一张 Mermaid 图方便后续复盘和写自己的脚本模板。渲染错误:Mermaid 渲染失败: Parse error on line 3: ...型] B -- C[print(value, type(value)) ----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got PS推荐把 print(value, type(value)) 当作临时探针使用。调试时插进去看清楚数据问题解决后再根据需要删除或改成日志输出。不建议把大量 print 长期留在正式脚本里。正式脚本如果需要保留排查信息更推荐写入日志文件或者封装一个调试开关。7. 用 type() 做分流处理type()不只是用来打印它也可以参与逻辑判断。比如我想处理一批 Excel 数据如果是字符串就先去掉空格再转数字如果本来就是数字就直接参与计算如果是空值就按 0 处理。value 1200 iftype(value)str:valuevalue.strip()valueint(value)elifvalueisNone:value0print(value,type(value))输出结果1200 class int不过这里要说清楚对于刚入门的读书笔记用type()看类型很好理解但在更严谨的 Python 写法里判断类型时很多时候会使用isinstance()。value 1200 ifisinstance(value,str):valuevalue.strip()valueint(value)print(value,type(value))可以这样理解type() 更适合“看清楚类型”isinstance() 更适合“写判断逻辑”。如果是 Excel 批量数据处理建议把类型处理逻辑写得更稳一点value 1,200 ifvalueisNone:value0elifisinstance(value,str):valuevalue.strip().replace(,,)valueint(value)print(value,type(value))输出结果1200 class int这里多处理了一个逗号因为很多 Excel 报表里的金额或数量会显示成1,200。如果不先去掉逗号直接int(1,200)会报错。实际写 Excel 自动化脚本时类型判断通常要和去空格、去逗号、判空、格式转换一起使用。8. 常见问题与踩坑提醒8.1 为什么我明明看到的是数字Python 却识别成 str这通常是 Excel 单元格格式或数据来源导致的。比如别人从系统里导出的报表金额字段可能被保存成文本有些单元格前面有隐藏空格还有一些数据是从网页复制进 Excel 的看着像数字实际是字符串。不要靠肉眼判断 Excel 数据类型脚本里一定要用 type() 或数据清洗逻辑确认。8.2 为什么 print 出来的值一样类型却不同比如10和10.0打印出来都很像但一个是int一个是float。如果后续涉及 Excel 写回、格式化显示、金额保留小数这个差异就会影响结果。a10b10.0print(a,type(a))print(b,type(b))输出结果10 class int 10.0 class float8.3 空单元格为什么会影响脚本运行因为空单元格读出来可能是None。None不是字符串也不是数字它表示“没有值”。如果你直接对它做加法、字符串拼接或格式转换就可能报错。valueNoneifvalueisNone:print(这是空值需要先处理)8.4 是否应该到处都写 type()不需要。type()更适合排错和验证阶段。等脚本逻辑稳定后可以把临时打印删掉或者改成日志记录。否则脚本输出会变得很乱。比较稳的做法是开发阶段多打印正式脚本少打印临时调试看控制台长期追踪写日志。8.5 type() 能不能判断 Excel 里的单元格格式不能完全判断。type()看到的是 Python 读取到的对象类型不是 Excel 单元格本身的显示格式。比如 Excel 里可以把数字格式设置成文本、日期、货币、百分比但 Python 读取后具体是什么类型还要看使用的库和读取方式。所以 type() 解决的是“Python 当前拿到的值是什么类型”不是“Excel 单元格原本设置了什么格式”。这两个问题不要混在一起。9. 总结提升这一节的核心不是背会type()这个函数而是建立一个很实用的排错习惯**当结果不符合预期时先确认变量的值和类型再判断代码逻辑。**我建议把这句话记住先打印再看类型先确认再转换。在 Python Excel 办公自动化里很多问题看似是代码问题实际上是数据类型问题。比如字符串数字、空值、浮点数显示、日期序列号这些都不是靠猜能解决的。type()的价值就在于它能把“我以为”变成“我确认”。如果只看表面值不看真实类型后面做汇总、统计、批量写回 Excel 时一定会踩坑。所以我会把 type() 当成 Python 办公自动化入门阶段的“照妖镜”它不复杂但非常实用它不能替你写完整业务逻辑但能帮你快速判断问题到底出在哪里。如果把这一节沉淀成自己的脚本习惯我建议保留这套排错顺序先打印字段名和值再打印类型确认类型后再转换转换后再次打印验证。这个动作很小但能明显减少无效排查时间。返回顶部