首页 > 解决方案 > 没有元数据的简单 Python xlsx 文件比较

问题描述

有没有一种简单的方法可以比较忽略元数据的python中的两个xlsx文件?尝试测试脚本的输出是否与预期的 xlsx 文件匹配。

我正在寻找像 filecmp.cmp() 这样不起作用的东西,因为文件的元数据不同(我认为唯一的区别是它们是在不同的时间编写的)。我看到其他一些人在谈论用 pandas 读取文件,这不是我想要的,因为我不想要开销(而且我关心的不仅仅是数据)。

或者,如果我能准确地弄清楚两者之间的元数据有什么不同,我可以引入一个变量,使脚本在作为我的测试套件的一部分运行时写入一个虚假的测试日期(与预期文件中的日期匹配)。

编辑:通过在我的 writer = pd.ExcelWriter(...) 调用中指定 engine='xlsxwriter',我可以在 writer.book 上使用 xlsxwriter 的 set_properties 方法:

writer.book.set_properties({'created': datetime.date(1936, 10, 31)})。这允许我每次都使用相同的创建日期写入文件,并且简单的 filecmp.cmp() 通过。我仍然很想听听是否有办法避免这种情况,因为它很hacky,但是嘿......它有效......

标签: pythonpandas

解决方案


如果你有两个这样的文件

value1   value2   value3
0.456   3.456    0.4325436
6.24654 0.235435 6.376546
4.26545 4.264543 7.2564523

value1   value2  value3
0.456   3.456    0.4325436
6.24654 0.23546  6.376546
4.26545 4.264543 7.2564523

你可以试试这样的...

from itertools import izip_longest
import xlrd

rb1 = xlrd.open_workbook('file1.xlsx')
rb2 = xlrd.open_workbook('file2.xlsx')

sheet1 = rb1.sheet_by_index(0)
sheet2 = rb2.sheet_by_index(0)

for rownum in range(max(sheet1.nrows, sheet2.nrows)):
    if rownum < sheet1.nrows:
        row_rb1 = sheet1.row_values(rownum)
        row_rb2 = sheet2.row_values(rownum)

        for colnum, (c1, c2) in enumerate(izip_longest(row_rb1, row_rb2)):
            if c1 != c2:
                print "Row {} Col {} - {} != {}".format(rownum+1, colnum+1, c1, c2)
    else:
        print "Row {} missing".format(rownum+1)

这将显示两个文件之间不同的任何单元格。对于您给定的两个文件,这将显示:

第 3 行第 2 列 - 0.235435 != 0.23546


推荐阅读