Python 自动化接单实战(二):Excel 批量清洗如何把规则与异常分开

客户说"整理一下 Excel",背后往往同时包含改列名、去空格、金额转换、重复行处理和异常留痕。真正可交付的脚本不能把坏数据悄悄丢掉,也不能让一处格式变化拖垮整批文件。

这一篇延续前两篇的配置驱动思路:先把输入统一成行记录,再让规则函数返回"结果或错误",最后分别输出干净数据与异常报告。示例使用标准库 CSV,接入 Excel 时只需替换读写适配层。

一、先定义不会含糊的验收规则

假设订单至少需要 order_id、amount 和 customer。金额必须非负,订单号不能为空;同一个订单号重复出现时,保留第一条并把其余记录写入异常文件。

python 复制代码
from decimal import Decimal, InvalidOperation

def clean(row):
    order_id = row.get("order_id", "").strip()
    customer = row.get("customer", "").strip()
    if not order_id:
        raise ValueError("missing order_id")
    try:
        amount = Decimal(row.get("amount", "").replace(",", "").strip())
    except InvalidOperation as exc:
        raise ValueError("invalid amount") from exc
    if amount < 0:
        raise ValueError("negative amount")
    return {"order_id": order_id, "customer": customer, "amount": str(amount)}

规则函数不负责打印,也不直接写文件,因此可以独立测试。客户修改金额约束时,只改这一层。

二、让每条失败记录都能回到原始位置

python 复制代码
import csv

seen, accepted, rejected = set(), [], []
with open("orders.csv", encoding="utf-8-sig", newline="") as source:
    for line_no, row in enumerate(csv.DictReader(source), start=2):
        try:
            item = clean(row)
            if item["order_id"] in seen:
                raise ValueError("duplicate order_id")
            seen.add(item["order_id"])
            accepted.append(item)
        except ValueError as exc:
            rejected.append({"line": line_no, "reason": str(exc), **row})

print(f"accepted={len(accepted)} rejected={len(rejected)}")

输出示例:

text 复制代码
accepted=248 rejected=7

交付时还应把 accepted 和 rejected 分别写入文件,并在异常报告中保留源文件名、行号和原因。这样客户可以修正 7 条数据后重跑,而不是重新核对 255 行。

三、批量目录要有明确停止条件

先用 2---3 个脱敏文件验证列名、编码和日期格式,再扩展到整个目录。若必填列缺失,应停止当前文件;若只是单行金额错误,则隔离该行并继续。规则不明确时先补样例,不要凭经验猜客户意图。


📌 本文把表格清洗拆成规则函数、正常输出和异常报告,让批量处理既能继续执行,也能逐条追溯。

💬 你的 Excel 清洗任务里,最容易反复变化的是列名、日期、金额还是去重规则?

👉 关注《Python 自动化接单实战》,下一篇继续拆解公开网页文本抓取器的范围控制、规则检查与结构化输出。

参考来源

相关推荐
hhcgchpspk20 分钟前
flask服务端页面预防被爬措施
后端·python·flask·网络爬虫·防爬
小小张说故事23 分钟前
Python 里 copy.copy() 和 deepcopy() 到底差在哪:拆开 __copy__、__deepcopy__ 和那个防止无限递归的 memo 字典
python
vipxieliang25 分钟前
Python collections:高效容器与实战案例
后端·python
青少儿编程课堂40 分钟前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
特创数字科技1 小时前
写了个 Windows 下载器:一键拉 GitHub / Gitee 源码,带 SHA256 校验
python·github
郝学胜-神的一滴2 小时前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn
天天被压力2 小时前
【A股分钟级高频数据完全手册 #09】A股历史分时交易数据接口:普通分时怎么批量下
java·人工智能·python
天天被压力2 小时前
【A股分钟级高频数据完全手册 #10】股票实时行情数据接口Python:公开源实时交易取数
java·人工智能·python
特立独行的猫A12 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
cpolar技术支持12 小时前
「我这边连不上你那个服务」—— 用清单驱动的 TCP 连通性只读看板,cpolar 让远端同事自己取证
python·内网穿透·tcp·cpolar·网络诊断