Python3.7 比较两个Excel文件指定列的值的异同,并将核对结果写入Excel中
时间:2020-03-13
本文章向大家介绍Python3.7 比较两个Excel文件指定列的值的异同,并将核对结果写入Excel中,主要包括Python3.7 比较两个Excel文件指定列的值的异同,并将核对结果写入Excel中使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景:
最近工作中需要核对客户的历史数据,
接近400行,需要核对的列有15列,
肉眼核对简直要吐血
心想着反正在学python呢
人生苦短
何不用python写个脚本
帮助我核对
我省出时间来做些更有意义的事情呢
前提:
我需要核对的两份Excel有以下特点:
- 有共同的主键
- 两份Excel的结构不尽相同,仅需要核对源文件47列中的15列,这些列在目标文件中都能找到
主要思路:
将两个文件的主键作为键,将要核对的列作为值,保存到字典中
然后再进行比较
实现代码:
import xlrd import xlwt import time origin_dict = {} # 初始化,用于保存源文件{key(主键):value(需要核对的列值)} target_dict = {} # 初始化,用于保存目标文件{key(主键):value(需要核对的列值)} # 放在函数外部声明 会报错 还不晓得原因 # success = 0 # fail = 0 def compare_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)) except Exception as error: print(str(error)) compare_excel('C111111.xlsx','O222222.xlsx',3,2) # 核对源文件第4列,目标文件第3列
后续:
代码还有很多优化的空间:
比如说源文件中有的键目标文件中没有,如何提示?
比如说能否一次比较多个列的值
比如扩展成双主键/多主键,该如何比对?
如果你有方法或思路,可以跟我这个小白一起交流
Python 我是越学越爱
原文地址:https://www.cnblogs.com/QianyuQian/p/12488567.html
- 解决在控制层springmvc框架发出的400状态的错误
- 解决springmvc在单纯返回一个字符串对象时所出现的乱码情况(极速版)
- MySQL日志文件之错误日志和慢查询日志详解
- 采用HTML5之"data-"机制自由提供数据
- Spring和SpringMVC父子的容器之道---[上篇]
- 快速完成(图片旋转,查看原图)
- Jsp中格式化时间戳的常用标签
- 反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射
- 后台模板管理系统___左侧菜单数据的异步加载
- Shiro眼皮下玩ajax,玩出302 Found
- 对于JSONObject,我只是临时抱佛脚
- 总结切面编程AOP的注解式开发和XML式开发
- SpringMVC注解@RequestMapping之produces属性导致的406错误
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法