用 Python 做批量 CSV 清洗时,先统一字段再谈规则

用 Python 做批量 CSV 清洗时,先统一字段再谈规则

很多人第一次做 CSV 批量清洗时,最先想到的是写各种规则:去重、补空值、改格式、筛异常、改编码。结果脚本越写越长,后面一换来源文件,规则就开始互相打架。

CSV 清洗真正最值得先做的,不是急着写几十条业务规则,而是把字段结构先统一下来。字段名不统一、日期格式不统一、空值表达方式不统一,后面所有清洗逻辑都会变得脆弱。

第一步先统一列名

不同来源的 CSV 很容易出现这种情况:

  1. `phone`
  2. `mobile`
  3. `手机号`
  4. `联系电话`

它们其实表达的是同一个意思,但如果你不先做字段映射,后面每条规则都得兼容一遍。

更稳的方式通常是先做一层列名标准化,例如统一成:

  1. `user_name`
  2. `mobile`
  3. `created_at`
  4. `status`

这样后面再写清洗规则,代码会简单很多。

第二步再统一空值表达

CSV 里的空值非常容易乱:

  1. 空字符串
  2. `NULL`
  3. `N/A`
  4. `-`
  5. 空格

如果不先统一,后面的判空逻辑就会到处重复写。

所以很适合在数据入脚本后,先做一轮标准化,把这些值统一处理成同一种缺失表达。

日期和数字字段也要尽早规范

很多清洗脚本后面难维护,不是因为业务规则复杂,而是同一列数据格式不一致。

例如日期字段里同时混着:

  1. `2026/04/24`
  2. `2026-04-24`
  3. `24-04-2026`
  4. `2026.04.24 13:00`

数字字段也可能同时有:

  1. `1,200`
  2. `1200`
  3. `1200.00`
  4. `¥1200`

如果这些基础格式不先整理,后面的统计、筛选和入库都容易出错。

去重别只按整行比

很多脚本一做去重,就直接按整行去比。这样当然简单,但很多实际重复数据不是“完全一样”,而是关键字段重复。

更常见的做法通常是按业务键去重,例如:

  1. 手机号
  2. 邮箱
  3. 订单号
  4. 用户 ID + 日期

先把“什么叫重复”定义清楚,比直接上去删行更稳。

清洗规则最好拆成几个阶段

如果你把所有逻辑全写在一个循环里,后面读起来会非常累。我更建议把 CSV 清洗拆成几个阶段:

  1. 读取和编码处理
  2. 字段标准化
  3. 基础值清洗
  4. 业务规则处理
  5. 导出和异常记录

这样后面出问题时,你更容易知道是哪一层出了偏差。

异常数据别直接吞掉

很多批处理脚本最容易犯的一个错,是遇到异常值直接跳过。短期省事,后面排查会非常被动,因为你根本不知道数据到底丢了多少、丢在哪。

更稳的做法通常是:

  1. 正常数据输出到清洗结果
  2. 异常数据单独输出到错误文件
  3. 保留错误原因字段

这样后面补数据、回查来源、修规则都会轻松很多。

批量清洗最怕“规则写死在文件名里”

不少脚本最开始只服务一个数据源,后来来源一多,就开始出现:

  1. `if file_name == ...`
  2. `if source == ...`
  3. `if date_col in ...`

最后脚本越来越像补丁堆。

更稳的方式通常是:

  1. 规则配置化
  2. 字段映射独立出来
  3. 清洗步骤做成函数化流程

哪怕项目不大,只要把这一步做好,脚本寿命都会长很多。

一个更适合中小项目的处理顺序

如果你要做一批 CSV 清洗,我更建议按这个顺序:

  1. 先统一列名
  2. 再统一空值和格式
  3. 再做去重和业务规则
  4. 最后输出清洗结果和异常文件

这个顺序最大的好处是,后面每一层都建立在更稳定的数据结构上。

结语

Python 做 CSV 清洗真正容易失控的,不是规则写不出来,而是数据基础结构太乱。只要先把字段、空值和格式统一好,后面很多规则都会自然变简单。

对中小型自动化任务来说,先整理数据骨架,再谈业务细节,往往是最省力的做法。