背景:
最近工作中需要核对客户的历史数据,
接近400行,需要核对的列有15列,
肉眼核对简直要吐血
心想着反正在学python呢
人生苦短
何不用python写个脚本
帮助我核对
我省出时间来做些更有意义的事情呢
前提:
我需要核对的两份Excel有以下特点:
有共同的主键
两份Excel的结构不尽相同,仅需要核对源文件47列中的15列,这些列在目标文件中都能找到
主要思路:
将两个文件的主键作为键,将要核对的列作为值,保存到字典中
然后再进行比较
实现代码:
importxlrdimportxlwtimporttime
origin_dict= {} #初始化,用于保存源文件{key(主键):value(需要核对的列值)}
target_dict = {} #初始化,用于保存目标文件{key(主键):value(需要核对的列值)}
#放在函数外部声明 会报错 还不晓得原因#success = 0#fail = 0
defcompare_excel(ori_path,tar_path,col_ori,col_tar):‘‘‘ori_path:用于存放源文件
tar_path:用于存放目标文件
col_ori:源文件中需要比较的列
col_tar:目标文件中需要比较的列‘‘‘success= 0 #核对无差异的个数
fail = 0 #核对结果有差异的个数
row_res = 0 #要写入的文件的行
#分别打开源文件与目标文件
wb_ori =xlrd.open_workbook(ori_path)
wb_tar=xlrd.open_workbook(tar_path)#新建一个excel,用于存放核对结果
wb_res =xlwt.Workbook()#分别获取源文件与目标文件的sheet
sheet_ori =wb_ori.sheet_by_index(0)
sheet_tar=wb_tar.sheet_by_index(0)#新建一名称为result的sheet页,用于存放核对具体结果
sheet_res = wb_res.add_sheet(‘result‘)#获取源文件中由主键、需核对列组成的键值对,放入字典中
for row_ori in range(1,sheet_ori.nrows):
cell_ori_key= sheet_ori.cell_value(row_ori,0) #因我的源文件的主键位于第0列,故该列未参数化,大家可以视自己实际情况进行优化
cell_ori_value =sheet_ori.cell_value(row_ori,col_ori)
origin_dict[cell_ori_key]=cell_ori_value#print(‘源文件获取成功‘)
#print(‘源文件如下:%s‘ % origin_dict)
#获取目标文件中由主键、待核对列组成的键值对,放入字典中
for row_tar in range(1,sheet_tar.nrows):
cell_tar_key=sheet_tar.cell_value(row_tar,0)
cell_tar_value=sheet_tar.cell_value(row_tar,col_tar)
target_dict[cell_tar_key]=cell_tar_value#print(‘目标文件获取成功‘)
#print(‘目标文件如下:%s‘ % target_dict)
#核对逻辑
try:for i in origin_dict.keys(): #获取源文件字典的键
if target_dict.get(i) == origin_dict.get(i): #对比两个字典中相同键的值
success += 1 #值相等,则无差异数+1
sheet_res.write(row_res+1,0,i) #将键写入结果文件的第0列
sheet_res.write(row_res+1,1,‘你俩长一样‘) #将核对无差异结果写入结果文件的第1列
row_res += 1 #结果文件行数+1
print(‘金融产品 %s 核对无差异‘%i)else:
fail+=1 #值不相等,则有差异数+1
sheet_res.write(row_res+1,0,i)
sheet_res.write(row_res+1,1,‘核对有差异:源文件的值为:%s,目标文件的值为:%s‘ % (origin_dict.get(i),target_dict.get(i))) ##将核对有差异结果写入结果文件的第1列
row_res += 1 #结果文件行数+1
print(‘金融产品 %s 核对有差异:源文件的值为:%s,目标文件的值为:%s‘ %(i,origin_dict.get(i),target_dict.get(i)))
wb_res.save(‘result.xlsx‘) #保存结果文件
print(time.strftime(‘%Y-%m-%d %H-%M-%S‘,time.localtime())+‘核对完成,共核对 %d 条,其中无差异 %d 条, 有差异 %d条‘ %(len(origin_dict),success,fail))exceptException as error:print(str(error))
compare_excel(‘C111111.xlsx‘,‘O222222.xlsx‘,3,2) #核对源文件第4列,目标文件第3列
后续:
代码还有很多优化的空间:
比如说源文件中有的键目标文件中没有,如何提示?
比如说能否一次比较多个列的值
比如扩展成双主键/多主键,该如何比对?
如果你有方法或思路,可以跟我这个小白一起交流
Python 我是越学越爱