我有一个包含数据的 Excel 文件。我正在寻找一种简单的方法来确保这些数据未被修改。如何使用 Python(2.x 和 3.x)执行此操作?
编辑
我简化了问题,因为我发布的原始问题只是表明了我是多么困惑,虽然提出了正确的解决方案,但对我来说还不够详细。执行此类操作的简单解决方案是在文件内容上使用现有的校验和计算库。
在 Linux 中使用 SHA512 的示例:
sha512sum excel_file.xlsx
Python 示例,给出与上面相同的结果:
import hashlib
h = hashlib.sha512()
with open('crc.py', 'rb') as f:
contents = f.read()
h.update(contents)
print(h.hexdigest())
为此您不需要校验和。
import pandas as pd
df1 = pd.read_excel("...")
df2 = pd.read_excel("...")
exact_match = df1.equals(df2)
如果值完全匹配,exact_match 将返回
True
,否则返回 False
。
您可以使用 openpyxl python 库 来实现此目的。您所要做的就是循环遍历工作表并将累积数据存储在字符串(或您喜欢的任何格式)中以供以后比较:
from openpyxl import Workbook, load_workbook
wb = load_workbook(filename = 'latest.xlsx')
sheet = wb["some_sheet"]
sheet_data = ""
i = 1
while sheet['a'+str(i)].value != None:
sheet_data = sheet['a'+str(i)].value + "::" + sheet['b'+str(i)].value + "::" + sheet['c'+str(i)].value + "\n"
i += 1
if sheet_data != old_sheet_data: #store the old_sheet_data somewhere
pass #not matched
您可以使用 pip3 或 pip 包管理器安装
openpyx
库。
在 Prahlad Yeri 的帮助下,我成功实现了这一目标。我发现我需要的东西在 zlib 库中。
我将所有单元格内容与每个字符串之间的“:”相加(可以使用任何其他被认为安全的字符),并使用 zlib 库的 adler32 函数计算出 32 位校验和。
import zlib
tab = [{"A": "one", "B": "two", "C": "three"},
{"A": "four", "B": "five", "C": "six"}]
print str(calculate_checksum(tab))
def calculate_checksum(table):
"""Returns a 32bits checksum out of the concatenated cell contents, using Adler algorithm."""
data = ""
for row in table:
for column in ["A", "B", "C"]:
data += row[column] + ":" # Use ":" to separate each string
return zlib.adler32(data)