Python 编程

整理 CSV 之前,先把数据读对

处理数据的第一步,是知道自己读到了什么。

CSV 看起来只是几列文字,实际使用时却很容易遇到编码、缺列、空值和多余空格。一个脚本能够运行,不代表它已经正确理解了输入。先把读取规则写清楚,比在结果出错之后逐行追查更容易。

先约定一个很小的输入

假设需要读取一个 UTF-8 编码的 records.csv 文件,其中只有日期和内容两列。这个例子先不做统计,只检查每条记录是否具备必要字段。

date,note
2026-10-01,练习读取文件
2026-10-02,整理学习笔记

下面的日期和内容都是演示数据。重点是建立明确的输入约定:表头使用 date 和 note,两列内容都不能为空。

让边界检查留在入口

import csv

with open("records.csv", encoding="utf-8-sig", newline="") as file:
    reader = csv.DictReader(file)
    required = {"date", "note"}

    if not required.issubset(reader.fieldnames or []):
        raise ValueError("缺少 date 或 note 表头")

    for row in reader:
        date = (row.get("date") or "").strip()
        note = (row.get("note") or "").strip()

        if None in row or not date or not note:
            print(f"第 {reader.line_num} 行:列数异常或必要字段为空")
            continue

        print(date, note)

utf-8-sig 可以处理带有 UTF-8 BOM 的文件,也能读取普通 UTF-8 文件;它并不能替代对其他编码的判断。newline="" 则把换行处理交给 CSV 模块。这里的 strip() 只是去掉首尾空白,没有改变正文内容。

使用 csv.DictReader 时,多出来的列会存放在键 None 下。这个例子把它作为异常情况报告,避免悄悄丢掉一部分输入。对于缺少必要内容的行,也先给出提示,再继续读取。

读到内容,还不等于内容有效

这段代码只验证表头、基本列数和必要字段,不验证日期格式,也不做重复记录判断。若后续需要按日期排序,应增加日期解析;若不允许重复,应先定义“重复”的判定方式。每增加一条规则,都应该能说明它要避免哪一种实际错误。

先让输入的含义清楚,再让处理过程变快。

可以试着把演示文件的一条内容留空,或在某一行末尾多加一个逗号,再观察输出。这个小练习的价值,是把“读取成功”和“数据符合预期”分开理解。

费曼日志 · Python 编程学习笔记
← 返回学习笔记