做数据核对时,是不是总需要在Excel和数据库之间反复切换?比如把“Excel客户表”和数据库中的客户信息比对,检查是否有新增、修改或遗漏的记录。手动逐条核对ID、姓名、联系方式,眼睛都看花了,还容易因为输入误差导致错漏。别让跨平台核对成为负担,Python能帮你自动比对Excel与数据库数据,精准标记差异,让数据校验高效又可靠!
1. 代码拆解:
python
import pandas as pd
import pymysql # 以MySQL为例,其他数据库需替换对应库
# 读取Excel数据(含“客户ID”“姓名”“电话”列)
excel_df = pd.read_excel('客户信息表.xlsx')
# 连接数据库并查询数据
db = pymysql.connect(
host='localhost',
user='用户名',

password='密码',
database='客户数据库'
)
query = "SELECT 客户ID, 姓名, 电话 FROM 客户表"
db_df = pd.read_sql(query, db)
db.close()
# 按“客户ID”比对,添加来源标记
excel_df['来源'] = 'Excel'
db_df['来源'] = '数据库'
# 合并数据并筛选差异
merged = pd.merge(excel_df, db_df, on='客户ID', how='outer', suffixes=('_Excel', '_数据库'), indicator=True)
# 标记不同类型的差异
diff_results = []
for _, row in merged.iterrows():
if row['_merge'] == 'left_only':
diff_results.append({'客户ID': row['客户ID'], '差异类型': '仅Excel存在', '详情': ''})
elif row['_merge'] == 'right_only':
diff_results.append({'客户ID': row['客户ID'], '差异类型': '仅数据库存在', '详情': ''})
else:
# 检查字段是否不一致
if row['姓名_Excel'] != row['姓名_数据库']:
diff_results.append({
'客户ID': row['客户ID'],
'差异类型': '姓名不一致',
'详情': f'Excel:{row["姓名_Excel"]} vs 数据库:{row["姓名_数据库"]}'
})
if str(row['电话_Excel']) != str(row['电话_数据库']): # 转为字符串避免类型差异
diff_results.append({
'客户ID': row['客户ID'],
'差异类型': '电话不一致',
'详情': f'Excel:{row["电话_Excel"]} vs 数据库:{row["电话_数据库"]}'
})
# 保存差异结果
pd.DataFrame(diff_results).to_excel('数据差异核对表.xlsx', index=False)
首先,用pandas读取Excel中的客户信息,通过pymysql连接数据库并查询对应表的数据(以MySQL为例,其他数据库可替换为psycopg2等库)。按“客户ID”这一唯一标识合并两表,标记“仅Excel存在”“仅数据库存在”的记录;对两边都存在的记录,逐一比对“姓名”“电话”等字段,记录不一致的详情。最后将所有差异整理成Excel,清晰呈现哪里有问题,无需手动在两个平台间切换核对。
2. 场景应用:
- 场景:周三财务核对“Excel报销表”与数据库的“费用记录”,比对“报销单号”“金额”“部门”,快速发现Excel多报、漏报或金额不符的记录,确保数据一致;
- 场景:电商运营核对“Excel库存表”与数据库的“商品库存”,标记“仅Excel有库存但数据库为0”的商品,避免超卖风险;
- 场景:HR核对“Excel员工表”与人事数据库信息,检查“入职日期”“岗位”是否一致,确保员工信息在两个系统同步更新。
3. 避坑指南:
- 连接失败:数据库地址、账号密码错误会导致连接失败,需检查配置(如host是否为“localhost”或IP,端口是否正确);
- 字段类型差异:Excel中的“电话”可能是数字,数据库中是字符串,直接比对会判定为差异,需统一转为字符串(str());
- 大数据量卡顿:超过10万行数据时,merge操作可能变慢,可先按“客户ID”去重(drop_duplicates),或分批处理数据。
#办公自动化 #Excel数据库比对 #Python数据校验 #周三高效核对