去年接手了一个数据清洗的日常任务,每天需要从3个不同系统的Excel报表中提取数据,手动比对校验后生成汇总表。这个工作流程存在几个致命问题:
最崩溃的是有次周五下班前发现数据对不上,不得不把过去三天的报表全部重新检查一遍。这种重复劳动不仅消磨创造力,还经常影响其他重要工作的进度。
选择Python作为解决方案基于以下判断:
关键依赖库版本:
python复制pandas==1.3.5
openpyxl==3.0.9
xlrd==2.0.1 # 处理旧版xls格式
mermaid复制graph TD
A[原始报表] --> B[数据提取]
B --> C[格式标准化]
C --> D[逻辑校验]
D --> E[异常标记]
E --> F[汇总输出]
实际代码通过函数式编程实现,主要模块包括:
python复制def detect_file_type(filepath):
"""自动识别不同系统的报表版本"""
df = pd.read_excel(filepath, nrows=5)
# 通过特征列判断来源系统
if 'SAP_ID' in df.columns:
return 'sap'
elif df.columns[0].startswith('ERP'):
return 'erp'
else:
return 'legacy'
注意:实际项目中建议增加MD5校验,防止处理到错误版本的文件
python复制def safe_convert(value):
"""带异常处理的类型转换"""
try:
return float(value.strip())
except (ValueError, AttributeError):
if value in ['N/A', '-']:
return 0
return None
常见问题处理策略:
处理大文件时的黄金法则:
python复制# 分块读取替代一次性加载
chunk_size = 50000
for chunk in pd.read_excel('large.xlsx', chunksize=chunk_size):
process(chunk)
python复制from concurrent.futures import ThreadPoolExecutor
def batch_process(files):
with ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(process_file, files))
实测数据:处理300个文件时,4线程比单线程快2.8倍
使用PyInstaller一键打包:
bash复制pyinstaller --onefile --add-data "config.ini;." data_cleaner.py
python复制import logging
logging.basicConfig(
filename='app.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
日志分析建议:
| 指标 | 人工处理 | 自动化处理 |
|---|---|---|
| 耗时 | 120分钟 | 3分钟 |
| 准确率 | 95% | 100% |
| 可追溯性 | 无 | 完整日志记录 |
| 扩展性 | 需重新培训 | 修改配置即可 |
额外收益:
最值得的投资是花了2天时间构建测试数据集,覆盖了后续遇到的90%异常情况。这个项目后来扩展成了部门的数据预处理中间件,累计节省超过2000人工小时。