需求分析

近期需要一个脚本将录入员录入的两个Excel文件进行比对,检查二者录入的内容是否相同,将有错的内容以log日志的方式输出到.txt文件中,输出的内容是“文件1的路径”+“文件2的路径”+“哪个sheet表”+“第几列出问题”。这样方便人员进行确认并重新找出进行检查。

根据这样的需求,首先确定了所使用的工具和程序编写架构:

读取Excel表的数据:使用Python中的Panda库,其中的函数可以很方便的读取出所需要的数据。

程序框架

1.首先实现指定两个文件名的Excel表的指定列的数据读出并比对,按照需求设计输出log日志;

2.其次实现指定两个文件名的Excel表的不同Sheet表中指定列的数据读出并比对,按照要求输出log日志;

3.到这步就已经完成对两个文件的所有数据的比对了,接着把程序封装成函数,编写批处理程序;

4.给定对比的两个文件夹目录,挑出所有.xlsx文件放到列表中,用for循环一个一个打开再调用上一个函数进行比对,输出结果。

5.将其打包封装为.exe可执行文件,这样可以方便团队其他的小伙伴再没装Python或者panda包的情况下也可以利用这个脚本进行对比。

代码实现

  • 对比两个Excel表的异同:

代码如下:

# 对比一个sheet的值是否正确
def compareSheet(file1, file2, wavelist1):'''该函数对比同一个sheet表中的数据是否正确:param file1::param file2::param sheetName::return:'''sheet = pd.read_excel(wavelist1[0], sheet_name=None)  # 打开一次获取sheetsheet_names = list(sheet.keys())  # 获取sheet名称flag = len(sheet_names)  # 计算长度# print("sheet_names:",sheet_names)k = 0  # 控制sheet移动if k < flag:sheetName = sheet_names[k]data1 = pd.read_excel(file1, sheet_name=sheetName, usecols=[1])data1 = data1.values# print("打开",file1,"成功")data2 = pd.read_excel(file2, sheet_name=sheetName, usecols=[1])data2 = data2.valuesk = k + 1# print("打开", file2, "成功")# print("表1的值",data1)# print("表2的值",data2)len1 = len(data1)len2 = len(data2)if len1 == len2:for i in range(len1):test1 = data1[i]test2 = data2[i]# print('data1', test1)# print('data2', test2)if test1 != test2:print(file1, '和', file2, '中', sheetName, '中,第', i + 2, '列出错', test1, '!=', test2,file=file_handle)

从指定路径中找出所有xlsx文件:

#写入路径
filepath = "F:\\questionnaire\\datasheet1"  # 输入文件所在的路径
comparefilepath = "F:\\questionnaire\\datasheet2"  # 对比文件的路径
logfilepath = "F:\\questionnaire\\log.txt"  # 结果输出路径
file_handle = open(logfilepath, mode='w')  # 结果输出的路径
# file1 = 'F:\\questionnaire\\datasheet1\\271.xlsx'
# file2 = 'F:\\questionnaire\\datasheet2\\271.xlsx'
filenames1 = os.listdir(filepath)
filenames2 = os.listdir(comparefilepath)
wavelist1 = []
wavelist2 = []
# 读取路径1中所有xlsx数据
for filename in filenames1:name, category = os.path.splitext(filepath + filename)  # 分解文件扩展名if category == '.xlsx':  # 若文件为xlx音频文件wavelist1.append(filepath + '\\' + filename) # 获得文件路径 此数据要写入compare的filename中names1, cat = os.path.splitext(filename) # 获得文件名 此names数据在出错处当指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的数据为:',test)
# print(wavelist1)
# 读取路径2中所有xlsx数据
for filename in filenames2:name, category = os.path.splitext(comparefilepath + filename)  # 分解文件扩展名if category == '.xlsx':  # 若文件为xlx音频文件wavelist2.append(comparefilepath + '\\' + filename) # 获得文件路径 此数据要写入compare的filename中names2, cat = os.path.splitext(filename) # 获得文件名 此names数据在出错处当指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的数据为:',test)
# print(wavelist2)

将找出的文件按照顺序进行比对:

filenum1 = len(wavelist1)
filenum2 = len(wavelist2)
if filenum1 == filenum2:for j in range(filenum1):# print('wavelist1:', wavelist1[j])# print('wavelist2:', wavelist2[j])compareSheet(wavelist1[j], wavelist2[j], wavelist1)file_handle.close()
print("结果已经输出至:",logfilepath)

验证结果

我们使用Excel软件自带的Database Compare进行文件比对,验证所写脚本是否正确,有没有错判或者漏判的情况。

在输出日志中找到182.xlsx表进行对比,Python脚本的检查结果如下所示,Database Compare的检查结果如下所示。

从结果中可以看出,对单个文件检测结果是正确的,另外再对比其他文件试试。

源码

import pandas as pd
import os
# 对比一个sheet的值是否正确
def compareSheet(file1, file2, wavelist1):'''该函数对比同一个sheet表中的数据是否正确:param file1: 文件1的路径:param file2: 文件2的路径:param sheetName::return:'''sheet = pd.read_excel(wavelist1[0], sheet_name=None)  # 打开一次获取sheetsheet_names = list(sheet.keys())  # 获取sheet名称flag = len(sheet_names)  # 计算长度for k in sheet_names:data1 = pd.read_excel(file1, sheet_name=k, usecols=[1], keep_default_na=False)data1 = data1.valuesdata2 = pd.read_excel(file2, sheet_name=k, usecols=[1], keep_default_na=False)data2 = data2.valueslen1 = len(data1)len2 = len(data2)if len1 == len2:for i in range(len1):test1 = data1[i]test2 = data2[i]# print('data1', test1)# print('data2', test2)if test1 != test2:# print(file1, '和', file2, '中', k, '中,第', i + 2, '列出错', test1, '!=', test2)print(file1, '和', file2, '中', k, '中,第', i + 2, '列出错', test1, '!=', test2, file=file_handle)#写入路径
# filepath = "F:\\questionnaire\\datasheet1"  # 输入文件所在的路径
# comparefilepath = "F:\\questionnaire\\datasheet2"  # 对比文件的路径
# logfilepath = "F:\\questionnaire\\log.txt"  # 结果输出路径
filepath = input("输入原文件夹所在路径:\n")
comparefilepath = input("输入需要对比的文件夹所在路径:\n")
logfilepath = "log.txt"
file_handle = open(logfilepath, mode='w')  # 结果输出的路径
# file1 = 'F:\\questionnaire\\datasheet1\\271.xlsx'
# file2 = 'F:\\questionnaire\\datasheet2\\271.xlsx'
filenames1 = os.listdir(filepath)
filenames2 = os.listdir(comparefilepath)
wavelist1 = []
wavelist2 = []
# 读取路径1中所有xlsx数据
for filename in filenames1:name, category = os.path.splitext(filepath + filename)  # 分解文件扩展名if category == '.xlsx':  # 若文件为xlx音频文件wavelist1.append(filepath + '\\' + filename) # 获得文件路径 此数据要写入compare的filename中names1, cat = os.path.splitext(filename) # 获得文件名 此names数据在出错处当指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的数据为:',test)
# print(wavelist1)
# 读取路径2中所有xlsx数据
for filename in filenames2:name, category = os.path.splitext(comparefilepath + filename)  # 分解文件扩展名if category == '.xlsx':  # 若文件为xlx音频文件wavelist2.append(comparefilepath + '\\' + filename) # 获得文件路径 此数据要写入compare的filename中names2, cat = os.path.splitext(filename) # 获得文件名 此names数据在出错处当指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的数据为:',test)
# print(wavelist2)
wavelist1.sort(reverse=True)
wavelist2.sort(reverse=True)
filenum1 = len(wavelist1)
filenum2 = len(wavelist2)
if filenum1 == filenum2:for j in range(filenum1):# print('wavelist1:', wavelist1[j])# print('wavelist2:', wavelist2[j])compareSheet(wavelist1[j], wavelist2[j], wavelist1)file_handle.close()
print("结果已经输出至:",logfilepath)

Python比对指定目录下的Excel数据(附源码)相关推荐

  1. 读取指定目录下的excel表格

    接到一个小需求,读取指定目录下的excel表格 我们这边用的是springboot来创建工程 public static void main(String[] args) throws IOExcep ...

  2. python画圣诞帽_使用Python给头像加上圣诞帽或圣诞老人小图标附源码

    随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章:https://zhuanlan.zhi ...

  3. python画圣诞老人_使用Python给头像加上圣诞帽或圣诞老人小图标附源码

    随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章:https://zhuanlan.zhi ...

  4. Python入门--获取指定目录下的所有.py文件

    #列出指定目录下的所有py文件 import os path=os.getcwd()#获取当前目录 print(path) lst=os.listdir(path)#返回指定路径下的文件和目录信息 f ...

  5. python 实现爬取指定小说(两种实现方案 .附源码)

    python 实现爬取指定小说实时下载(附源码) import requests import re import time import randomdef download(book_name): ...

  6. python 实现模拟鼠标点击器 可运行 附源码

    工具下载链接(网盘) https://pan.baidu.com/s/1GIZPHQnRQqTD5h1Cy70MNQ?pwd=kxzz 一.前言: 对于一些比较肝的游戏,想要使用工具挂机: 对于一些购 ...

  7. Python制作经典游戏案例-水果忍者(附源码等文件)

    目录 前言 代码展示 总结 前言 大家好,我是辣条哥,今天给大家分享一款我以前特爱玩的游戏,水果大战,今天我就教大家使用python把这款游戏制作出来.我们先来看效果 点击跳转文末 相关的一些音乐文件 ...

  8. 【214情人节】低调奢华有内涵的python程序猿撒狗粮的正确姿势(附源码)

    目录 一. 效果演示 1. 原图-效果图对比 2. 看出两张图片的区别了吗? 二. 代码架构 三. 功能实现 3.1 图片处理 3.2 html 使用form表单,真心话和图片文件的布局 3.3 js ...

  9. Python基于民航业知识图谱的自动问答系统(附源码)

    一.开发环境 Windows 10 x64 Python 3.7 Neo4j community 3.5.20 二.项目运行 1.确保安装所需依赖 pip install -r requirement ...

最新文章

  1. excel中使用CORREL函数计算两个时间序列数据列之间的滚动相关性(Rolling correlations)、例如,计算两种商品销售额之间的3个月的滚动相关性
  2. urlPatterns映射的规则
  3. ASP.NET Core 5.0 Web API 自动集成Swashbuckle
  4. dataframe 众数的方法_学习数据分析数据方法论 [描述性统计分析]
  5. 【GOF23设计模式】迭代器模式
  6. vue 每次弹框都初始化
  7. html前端页面的基本骨架是,web前端入门到实战:css实现的骨架屏方案
  8. 【转】asp仿百度文库、豆丁doc转换(flashpaper)
  9. 在Windows下删除Linux系统的方法
  10. java 根号_没见过的 Java 入门教程之三!例程使用中文标识符代码:各种变量
  11. 不同浏览器CSS隐藏元素滚动条
  12. 机器学习7-主成分分析
  13. mysql上线脚本规范_MySQL 的 21 个规范、优化最佳实践!
  14. ZPL效果在线打印测试和相关手册及编程语言资料
  15. Prometheus+k8s之告警通知
  16. python爬虫入门(超详细!!!)
  17. 【巨人的肩膀上制造世界】——10——Unity3D实用插件之Vectrosity,轻松便捷的实现2D/3D画线功能
  18. uva 10014 Simple calculations(数学推导)
  19. 电影解说类自媒体如何才能脱颖而出
  20. mysql utl_file_pl/sql应用之利用utl_file写文件

热门文章

  1. Mysql学习(一)之简单介绍
  2. [导入]给家人补补钙!双莲炖腔骨
  3. C++基础知识-Day8
  4. [LeetCode] Flatten Binary Tree to Linked List
  5. 安装rabbitMQ delayed-messaged
  6. 系统聚类(hierarchical clustering analysis)
  7. 介绍 Java 的内存泄漏
  8. Asp.net中执行.EXE程序的方法
  9. postman+newman+jenkins环境部署
  10. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party