python - 没有元数据的简单 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,但是嘿......它有效......
解决方案
如果你有两个这样的文件
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
推荐阅读
- java - 从Java中的字符串中获取特定子字符串的问题
- r - 在计算 GLM 的置信区间时如何指定离散参数?
- node.js - Nodejs,续集连接池的最佳参数?
- ios - iOS - 如何在 tableView 单元格顶部添加子视图而不被前一个单元格覆盖
- javascript - 如何检查 javascript 变量的内存分配
- android - 处理来自客户端的 Rest sql 异常
- c++ - C++ 中的 Karatsuba 算法
- css - Angular:如何从组件中覆盖全局样式
- c# - Entity Framework Core not loading related data from reference table
- python - Python字典解包