有没有办法测试两个pkl文件是否在python中具有相同的数据?

时间:2014-03-08 07:23:22

标签: python pickle

我需要比较两个对象在python中是否具有相同的数据,但有些类型不支持==。我可以从它们中制作pkl文件然后比较字节数据吗?如果这不起作用,有没有办法比较他们的字节数据(假设我们不知道我们是否正在处理可能包含不同数据类型,列表,矩阵,数据帧等的两个元组)?根据我们是否正在查看包含矩阵,数据帧等的元组来编写具有不同情况的比较函数,看起来非常混乱。

3 个答案:

答案 0 :(得分:6)

甚至不能保证两个与==相等的对象腌制相同:

>>> x = (1,)
>>> y = (x, x)
>>> z = ((1,), (1,))
>>> y == z
True
>>> pickle.dumps(y) == pickle.dumps(z)
False
>>> {-1, -2} == {-2, -1}
True
>>> pickle.dumps({-1, -2}) == pickle.dumps({-2, -1})
False

序列化对象以比较它们的序列化表单不是可行的通用等式比较。如果你想定义自己的平等概念,写你自己的平等比较函数可能是你最好的选择。

答案 1 :(得分:0)

如果对象没有实现__eq__,那么进行等于比较可能无效。

如果您有某种方法可以定义它们是否相等,只需定义自己的比较方法,查看两个对象的属性,如果它们相等则返回true。即:

 def cmp(obj_a, obj_b):
     return a.att1 == b.att1 and a.att2 == b.att2 ... etc 

关于Pickle,它对原始数据的内容没有guarantees,只有当你取消它时才会产生相同的对象。

答案 2 :(得分:0)

有一个名为File Compare的好模块我已经使用了几次。我不是一个真正的编程高手,所以我不想给你一些古怪的建议。在我对这种应用程序的有限经验中,python模块在大约90%的时间内运行良好。这是我使用的代码:

injury_compare = filecmp.cmp('/ Users / MacBookPro15 / injuryc','/ Users / MacBookPro15 / injury')

打印“伤害档案是%s”%inury_compare

比较返回true / false,但我也认为模块中有一些东西为不同的行返回“+”,因此您也可以使用它。基本上,如果你得到一个“+”返回文件是不同的。我还建议使用bash / linux实用程序hexdump,它以简洁的公牛说明方式显示低级字节。它也很简单...... hexdump file1。即使对于像我这样对于hexdump输出甚至缺乏一点理解的人来说,即使不确切知道字节实际意味着什么,人们仍然可以辨别出一些模式。在bash / linux中也有一个差异函数,我认为你会相应地运行(不是100%肯定,但听起来很熟悉): diff file1 file2

对不起,我无法表达一些更好的观点,但我希望有所帮助。祝你好运!