去年接手了一个数据清洗的日常任务,每天需要从3个不同系统的Excel报表中提取数据,手工核对关键字段,再合并生成最终的分析报告。这个流程看似简单,但实际操作中遇到几个致命问题:
最崩溃的是有次因为感冒头晕,把两个系统的销售数据对调了,导致整周的经营分析报告全部作废。这个事件促使我下定决心用Python实现自动化处理。
经过梳理,这个自动化脚本需要实现以下核心功能:
最终技术栈组合如下:
python复制# 数据处理
import pandas as pd # 数据操作核心库
from openpyxl import load_workbook # 处理复杂Excel格式
# 自动化
import schedule # 定时任务
import pyautogui # 模拟人工操作遗留系统导出
# 通知提醒
import smtplib # 邮件报警
from win10toast import ToastNotifier # 桌面通知
选择Pandas而非纯标准库的原因:
原始代码:
python复制df1 = pd.read_excel("system1.xlsx")
实际生产环境中会遇到:
改进后的健壮写法:
python复制def safe_read_excel(path, retry=3):
for i in range(retry):
try:
return pd.read_excel(path)
except PermissionError:
time.sleep(2**i) # 指数退避等待
raise RuntimeError(f"文件{path}读取失败")
不同系统的字段对应关系存储在YAML配置文件中:
yaml复制mappings:
- source: "客户编号"
targets:
- system1: "CUST_ID"
- system2: "CustomerID"
validator: "\d{8}"
通过动态生成正则表达式校验器:
python复制def apply_mappings(df, config):
for rule in config["mappings"]:
for target in rule["targets"]:
if target in df.columns:
df[rule["source"]] = df[target].astype(str).str.extract(
f'^{rule["validator"]}$')[0]
return df
设置多层校验规则:
实现代码片段:
python复制def validate_data(df):
errors = []
# 检查必填字段
for col in REQUIRED_FIELDS:
if df[col].isnull().any():
errors.append(f"{col}存在空值")
# 检查业务规则
if (df["销售额"] < 0).any():
errors.append("存在负销售额记录")
return errors
python复制def main():
# 1. 自动下载源文件
download_files()
# 2. 加载并预处理
df1 = safe_read_excel("system1.xlsx")
df2 = safe_read_excel("system2.csv")
# 3. 字段标准化
df1 = apply_mappings(df1, CONFIG)
df2 = apply_mappings(df2, CONFIG)
# 4. 合并数据
merged = pd.merge(df1, df2, on="客户编号", how="outer")
# 5. 校验
if errors := validate_data(merged):
send_alert("\n".join(errors))
# 6. 输出结果
merged.to_excel("final_report.xlsx", index=False)
python复制schedule.every().day.at("09:30").do(main)
while True:
schedule.run_pending()
time.sleep(60)
重要:处理企业级文件时总会遇到文件被占用的情况。实测发现单纯用try-catch不够可靠,必须配合以下措施:
不同系统导出的CSV可能使用:
通用解决方案:
python复制encodings = ['utf-8-sig', 'gb2312', 'cp1252']
for enc in encodings:
try:
return pd.read_csv(path, encoding=enc)
except UnicodeDecodeError:
continue
当处理超过10万行数据时:
dtype={'column': 'str'}chunksize=50000| 指标 | 人工处理 | Python脚本 |
|---|---|---|
| 耗时 | 120分钟 | 3分钟 |
| 准确率 | 85% | 99.7% |
| 可追溯性 | 无日志 | 完整操作日志 |
| 扩展性 | 固定流程 | 配置驱动 |
实际部署后带来的额外收益:
这个脚本后来被推广到其他5个业务部门,核心处理逻辑至今仍在线上稳定运行。最大的体会是:自动化工具真正的价值不在于节省时间本身,而是把人从重复劳动中解放出来后,可以去发现和解决那些真正需要人类智慧的问题。