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

9 投票
3 回答
7714 浏览
提问于 2025-04-17 21:24

我需要在Python中比较两个对象是否有相同的数据,但有些类型不支持用==来比较。那我能不能把它们都做成pkl文件,然后比较一下字节数据呢?如果这样不行,有没有其他方法可以比较它们的字节数据(比如我们不知道这两个对象是不是包含不同数据类型的元组、列表、矩阵、数据框等等)?写一个比较函数,根据我们比较的对象是矩阵、数据框等来处理不同情况,感觉会很麻烦。

3 个回答

-1

有一个叫做文件比较的好模块,我用过几次。其实我并不是编程高手,所以不想给你一些奇怪的建议。在我有限的经验中,这个Python模块大约有90%的时间都能正常工作。下面是我用的代码:

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

  print "injury files are %s" % inury_compare

这个比较会返回真或假,但我觉得这个模块里还有一些东西可以返回一个“+”,表示某一行不同,你也可以用这个来处理。简单来说,如果你得到一个“+”,那就说明文件是不同的。我还可以推荐使用bash/linux里的hexdump工具,它可以以一种非常简单的方式显示低级别的字节。用法也很简单……hexdump file1。即使像我这样对hexdump输出没有什么了解的人,也能看出一些模式,尽管不知道这些字节具体是什么意思。还有一个在bash/linux里的差异函数,我觉得你可以这样运行(虽然我不太确定,但听起来很熟悉): diff file1 file2

抱歉我不能详细说明一些细节,但希望这些信息能对你有所帮助。祝你好运!

0

如果一个对象没有实现 __eq__ 这个方法,那么进行相等比较可能就不太合理。

如果你有办法判断两个对象是否相等,那就可以自己定义一个比较的方法,看看这两个对象的属性,如果它们相等就返回真(true)。比如:

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

关于 Pickle,它并不对其原始数据的内容做任何 保证,只是说如果你把它反序列化(unpickle),最终会得到同样的对象。

8

== 比较的两个对象,即使它们看起来相等,也不一定在保存成文件时是一样的:

>>> 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

把对象转成可以存储的形式来比较它们的存储结果,这种方法并不适合用来判断对象是否相等。如果你想定义自己认为的相等标准,写一个自己的相等比较函数可能是最好的选择。

撰写回答