DEBUG.WIKI
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
雨云;给项目一台云服务器
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →

Polars 2.0.0 部分改列名报 SchemaError,先保留完整 CSV

read_csv 的 new_columns 少于文件列数时,Polars 2.0.0 可能拒绝读取。可先完整读取再 rename,避免用 extra_columns=ignore 绕过错误时丢掉仍需保留的列。

Polars 升到 2.0.0 后,CSV 有两列,new_columns 只提供一个名字,读取便报 SchemaError。原本只想改第一列名称,错误信息却要求名字数量与文件列数相同:

provided `new_columns` does not match number of columns in file (1 != 2 in file)

这属于部分重命名路径的问题。2.0.0 的参数说明仍写着:名单较短时,其余列保留原名;实际读取却可能在收集结果时拒绝这组列名。不要把它理解为 CSV 少了一列,也不要仅凭错误中的建议忽略额外列。

先完整读取,再只改需要的名字

下面补出一份完整的两列 CSV 作为说明例。输入有表头,目标是把 years 改为 age,同时保留 name 的值和列位置:

from io import StringIO
import polars as pl

source = StringIO("years,name\n1,alice\n")
frame = pl.read_csv(source)
renamed = frame.rename({"years": "age"})

assert renamed.columns == ["age", "name"]
assert renamed.shape == (1, 2)

真实文件应使用实际表头作映射键,先确认待改列确实存在,目标列名也没有与其他列冲突。这个办法保留读取阶段对完整文件的列识别;其他 schema_overrides、缺失值和日期解析配置仍按原业务规则保留。

列结构固定时,也可以在 new_columns 中提供完整名单,例如 ['age', 'name']。完整名单按位置对应文件中的列,不会替你验证业务含义;上游调整列顺序后,仍可能得到名称正确、内容错位的表格。

忽略额外列会改变数据范围

extra_columns='ignore' 表示忽略定义范围之外的列,并非“保留剩余列原名”。如果第二列仍有业务用途,这样绕过错误可能把读取成功变成静默丢列。truncate_ragged_lines 也用于另一类超宽记录处理,不应拿来修复本次重命名。

没有表头的文件要另外约定位置与名称,不能直接套用示例中的 years。只想选择部分列时,应明确执行列选择,并把减少列数作为接口变化验收,而不是让错误处理悄悄决定输出范围。

截至 2026 年 10 月 24 日,当前正式版本仍为 2.0.0;这里采用的是完整读取后的重命名方案。后续更新依赖时,仍应保留短名单场景,确认实际安装版本的行为,再决定是否恢复原写法。

保留 CSV 原件,核对输出列数、顺序、表头、数据类型和未重命名列的值。若结果还要导出,先写到新路径,让下游读取核对;修正读取代码无法找回之前已被忽略后覆盖保存的列。