赞
踩
近期需要一个脚本将录入员录入的两个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) # 打开一次获取sheet sheet_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.values k = 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) # 打开一次获取sheet sheet_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.values data2 = pd.read_excel(file2, sheet_name=k, usecols=[1], keep_default_na=False) data2 = data2.values 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, '中', 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。