每个月底核对200多个客户的账单,两个Excel文件一个200多行一个300多行,纯手动一行行比对金额和日期——这种活,干过的人都知道是有多折磨。
前段时间正好碰到这个场景,想着就让AI写个Python脚本处理,几分钟应该就能搞定。打开DeepSeek输入需求,不到半分钟代码就出来了。看着那段代码心里挺美?可别高兴的太早了。
后面一路折腾,前后踩了5个坑,代码才能运行成功并输出正确的结果。
哪5个坑?下面一个一个的说。
代码跑不起来
AI写的代码复制到PyCharm一运行,直接报错:ModuleNotFoundError: No module named 'openpyxl'。
AI给的代码里写了import openpyxl,但它没告诉我们这个库要单独装。对于写过Python的人来说这不是事,但如果是第一次碰Python的人,可能卡在这里就放弃了。
# 命令行装一下就行# pip install openpyxl库的问题:代码运行,前提要安装必要库。这个坑不大,但是很典型。AI可能默认你的环境是齐全的,实际上很多人Python都是刚装的,环境问题一个大箩筐。
文件找不到
装好库再跑,又报错:FileNotFoundError。
AI给的代码用的是相对路径,但PyCharm的工作目录和文件实际位置不一定一致。这个坑见过太多次了,AI生成的代码几乎都是假设文件就在当前目录下。
# AI给的写法(容易出问题)file1 = '客户账单.xlsx'# 改成这样更稳import osbase_dir = os.path.dirname(__file__)file1 = os.path.join(base_dir, '客户账单.xlsx')# Windows路径分隔符的问题也一起解决了文件路径问题:要把代码里的路径改成真实环境下的路径。扯一句题外话,文件路径这个问题在Python里算高频踩雷区了,Windows用反斜杠、Mac用正斜杠、代码里又要转义……用os.path.join()的话能省掉不少麻烦。
比对结果全是"不匹配"
终于能读取文件了,但跑出来的结果——所有记录都标记为"不匹配"。
打开Excel一看就明白了:两个表格里的客户名称列,一个有前后空格一个没有;金额列,一个是文本格式一个是数字格式,有的还带了千分位逗号。AI给的代码直接用“==”比对,当然全都不一样。
# 清洗客户名称df1['客户名称'] = df1['客户名称'].str.strip()df2['客户名称'] = df2['客户名称'].str.strip()# 金额清洗,去逗号转数字df1['金额'] = df1['金额'].astype(str).str.replace(',', '').astype(float)df2['金额'] = df2['金额'].astype(str).str.replace(',', '').astype(float)# 日期统一格式df1['日期'] = pd.to_datetime(df1['日期']).dt.datedf2['日期'] = pd.to_datetime(df2['日期']).dt.date数据格式问题:文件格式不统一,数据匹配不成功。这个坑最耗时间,也最容易忽视。AI的代码逻辑没有错,但它假设你的数据是干净的。实际工作中Excel数据什么情况都有——空格、隐藏字符、格式不统一,这些它预料不到。让AI能帮你写代码处理数据,格式问题必须提前弄清楚,让它先做数据清洗。
结果看着对,其实是错的
脚本跑通了,差异记录也输出了,但仔细一看——里面有一堆莫名其妙的"不匹配",明明金额对得上却被标记为差异。
排查了半天,问题出在客户名称重复上。同一个客户在Excel里出现了两次,既有"应收账款"又有"预付账款"。AI生成的代码直接用merge按客户名称合并,一个客户的多条记录两两交叉匹配,自然产生大量误报。
# AI默认客户名称是唯一的,但实际业务中经常不是# 得自己加一个组合键df1['match_key'] = df1['客户名称'] + '_' + df1['日期'].astype(str)df2['match_key'] = df2['客户名称'] + '_' + df2['日期'].astype(str)merged = pd.merge(df1, df2, on='match_key', how='outer', suffixes=('_账单', '_对账'))# 加个重复检查,省得后面排查到怀疑人生for name, df in [('账单', df1), ('对账单', df2)]: if df.duplicated(subset=['match_key']).any(): print(f"⚠ {name}里有重复记录,先检查数据源")匹配项不唯一:自定义组合键,确保唯一性,才能正确匹配数据。这个坑比前几个都要隐蔽——代码跑通了,结果也生成了,但结果是错的。等发现的时候可能已经用错误数据做了决策,后果比报个错严重多了。
数据量一大就卡死
200多行数据pandas轻松搞定,但是,把这个脚本给另一个同事用,他的Excel有5万多行,一跑直接内存报错,电脑风扇狂转。
AI给的代码把所有数据一次性加载到内存,数据量小没问题,几万行普通办公电脑通常扛不住。
# 先判断一下数据规模再决定怎么读sample = pd.read_excel('客户账单.xlsx', nrows=1000)if len(sample) == 1000: print("数据量较大,注意内存占用") # 指定dtype能省不少内存 df1 = pd.read_excel(file1, dtype={'客户名称': str, '金额': float})else: df1 = pd.read_excel(file1)数据量大占用内存问题:超过1万行要考虑内存优化,超过10万行Excel本身就不太合适了,得换数据库方案。不过大部分日常办公场景,几万行以内pandas还是够用的。
最终跑通的代码(示例)
折腾了一圈,把上面5个问题都解决,200多行数据不到2秒比对完成,输出3条差异记录。
import pandas as pdimport os# 获取文件所在目录,解决文件路径问题base_dir = os.path.dirname(__file__)file1 = os.path.join(base_dir, '客户账单.xlsx')file2 = os.path.join(base_dir, '对账单.xlsx')# 先判断数据规模大小,避免内存挤爆try: sample = pd.read_excel(file1, nrows=1000) if len(sample) == 1000: print("数据量较大,注意内存占用") # 指定dtype能省不少内存 df1 = pd.read_excel(file1, dtype={'客户名称': str, '金额': float}) df2 = pd.read_excel(file2, dtype={'客户名称': str, '金额': float}) else: df1 = pd.read_excel(file1) df2 = pd.read_excel(file2)except Exception as e: print(f"读取文件失败,请检查文件路径和格式:{e}") exit(1)# 先做数据清洗,解决格式不一致问题 df1['客户名称'] = df1['客户名称'].str.strip()df2['客户名称'] = df2['客户名称'].str.strip()df1['金额'] = df1['金额'].astype(str).str.replace(',', '').astype(float)df2['金额'] = df2['金额'].astype(str).str.replace(',', '').astype(float)df1['日期'] = pd.to_datetime(df1['日期']).dt.datedf2['日期'] = pd.to_datetime(df2['日期']).dt.date# 创建组合键(客户名称+日期),解决唯一键问题df1['match_key'] = df1['客户名称'] + '_' + df1['日期'].astype(str)df2['match_key'] = df2['客户名称'] + '_' + df2['日期'].astype(str)# 重复检查,避免误匹配for name, df in [('账单', df1), ('对账单', df2)]: if df.duplicated(subset=['match_key']).any(): print(f"⚠ {name}里有重复记录,请先检查数据源") # 这里可以选择继续或退出,根据业务需求决定# --- 合并比对 ---merged = pd.merge(df1, df2, on='match_key', how='outer', suffixes=('_账单', '_对账'))# 找差异diff = merged[ (merged['金额_账单'] != merged['金额_对账']) | (merged['日期_账单'] != merged['日期_对账'])]# 输出结果if not diff.empty: diff.to_excel('差异记录.xlsx', index=False) print(f'发现{len(diff)}条差异,已保存到差异记录.xlsx')else: print('全部匹配,没问题') 五个要避的坑汇总:
问题 | 类型 | 难度 |
缺少依赖库 | 环境 | 低,装一下就行 |
文件路径不对 | 运行环境 | 低,改成绝对路径 |
数据格式不一致 | 数据质量
| 中,得加清洗逻辑 |
唯一键不唯一 | 业务逻辑 | 高,代码不报错但结果错 |
数据量大跑不动 | 性能 | 中,提前判断规模 |
AI写代码确实快,需求到代码不到一分钟,但真正跑通要花大半个小时以上。AI就像一个特别聪明但有点"死脑筋"的实习生——代码逻辑没问题,但不知道你的实际环境长什么样、数据干不干净、业务规则是什么。这些你都得提前弄清楚,要么告诉它,要么自己补全代码。
你如果觉得这篇文章对你有帮助,记得:点个赞收藏起来!也可以评论区聊聊——你的想法或者遇到的问题。我们一起交流学习,关注我,不迷路!
如果你已经是此中高手,也欢迎在评论区分享你的经验。
