恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
游戏关卡 CSV 少了列:先检查表头再读数据
首页
资讯中心
/
游戏关卡 CSV 少了列:先检查表头再读数据
游戏关卡 CSV 少了列:先检查表头再读数据
发布时间:2026/10/13 10:21:20
大家好我是 SiKi老师。用 Python 整理关卡表时如果读取结果里没有敌人数量先别忙着给每个关卡补 0。可能是整张表缺少enemy_count列也可能是某一行少了一个单元格。两种情况要回到不同的位置修。本文使用自拟的小型 CSV 字符串在 Windows、Python 3.12.14 独立运行。没有读取真实关卡表、覆盖文件或导入引擎列名和关卡编号用于说明工具检查方法不代表某个课程或引擎的实际数据格式。一 DictReader 不是关卡格式验证器importcsvimportio textlevel_id,enemy_count\nL01,3\nreadercsv.DictReader(io.StringIO(text,newline))print(reader.fieldnames)print(list(reader))实际表头是[level_id, enemy_count]数据是{level_id: L01, enemy_count: 3}。注意数量仍为字符串读取成功不会自动证明它是整数或在允许范围内。Python 3.12 csv 文档说明没有另外传入字段名时第一行提供字段名。若你收到的文件没有表头就不能原样套用这个约定否则第一条数据可能被当成表头。这里明确要求文件第一行就是表头。本文用 StringIO 保持实测隔离。读取真实文件时编码要符合实际来源打开 CSV 的换行处理也要按官方文档设置不要用这段内存测试宣称真实文件的编码已经检查过。二 先拒绝缺列、空列名和重复列名最先检查的是结构不是行内数值required{level_id,enemy_count}fieldsreader.fieldnamesifnotfields:raiseValueError(没有表头)ifany(notname.strip()fornameinfields):raiseValueError(空表头)iflen(fields)!len(set(fields)):raiseValueError(重复表头)ifrequired-set(fields):raiseValueError(缺少必填列)我分别测试了只有level_id的表、末尾空列名的表、出现两次enemy_count的表得到缺必填列、空表头、重复表头三种错误。本例要求列名精确匹配enemy_count带尾空格不会被自动改名。空白检查用strip但没有对非空列名统一去空格、忽略大小写或合并别名。若你要支持这些约定应先定义规范化规则再检查规范化之后是否发生重复不能悄悄选一个值。重复表头需要在逐行字典生成之前挡住。字典不能保存两个完全相同的键等字典里只剩一个键时再数键已经不能还原表头里出现了几次。三 数据行缺格与空字符串分开识别有正确表头也可能遇到短行L01或者显式空值L01,。官方文档规定短行的缺失值默认补成None而后者的第二个单元格是空字符串。本文把这两种情况都作为必填值缺失rows[]forrowinreader:ifNoneinrow:raiseValueError(数据行多了列)ifany(row[key]isNoneornotrow[key].strip()forkeyinrequired):raiseValueError(必填单元格缺值)rows.append(row)短行和尾逗号行实测都被拒绝正常行进入列表数量仍是3。额外一个单元格的行则报告多列默认DictReader将多出的值放到键None对应的列表中。这个检查依赖默认restkey、restval改过它们就要相应修改判断。这里只拒绝多出来的单元格不拒绝表头里另外定义的可选列。对于可选列缺值代码也没有作统一要求。是否允许额外定义字段、哪些列必须齐全应由关卡表协议确定。四 列结构通过后再做数值检查字符串三只也能正常进入字典。int转换是否成功、负数是否允许、关卡编号是否唯一都是下一层验证。不要把“csv.reader 没报错”写成“关卡可以运行”。处理失败时保留原表和错误记录不直接补默认敌人数。缺列意味着来源表的结构不符缺格意味着数据行不完整。两者都直接补 0会使真正的缺口变成一份貌似合法但含义已改变的表。这份例子没有汇总所有错误或输出精确物理行号。带引号的 CSV 单元格可以含换行数据记录编号和文本行号未必相同。需要定位时再设计日志不编造一个看似准确的行号。五 用六种错误表检查失败分支独立脚本测试了缺列、空表头、重复表头、短行、空必填单元格和多格行并断言各自错误正常行断言保留原字符串值。测试完全在内存中完成没有真实引擎加载、超大文件性能或不可信输入防护的证据。先确定“第一行是表头、必填列是哪两个、列名是否精确匹配”再运行检查才能解释失败代表什么。你遇到的关卡表问题是整列没交付还是某条记录缺值把这两种错误分开报告修表的人就不用猜了。