当前位置:   article > 正文

Python比对指定目录下的Excel数据(附源码)_python xlsx文件比对

python xlsx文件比对

需求分析

近期需要一个脚本将录入员录入的两个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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

从指定路径中找出所有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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

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

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

验证结果

我们使用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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号