找到重复项后进行反向处理

时间:2018-08-05 19:35:30

标签: python arrays python-3.x

我看到一些帖子可以在目录中查找重复项并进行压缩:hereherehere,但是这些帖子都没有解释如何撤消该过程。

因此,在此过程之后,您将得到文件哈希,文件本身以及它们发生的位置。就我而言,我正在使用该算法在文件中查找重复项。从一个6 kB的文件,我减少到2 kB。当我尝试重建文件时,内容相同,但是文件大小和比较失败。

这是我的代码,用于重建我根据先前的post修改的文件:

import pickle
import hashlib

with open(compressed, 'rb') as f, open(recovered, "wb") as fname:
    a_dict = pickle.load(f) # loads the compressed file
    a_list = []
    for values_list in a_dict.values():
        file_bytes = values_list.pop(0)
        for val in values_list:
            a_list .insert(val, file_bytes)
        result = tuple(a_list)
        pickle.dump(result, fname, protocol=pickle.HIGHEST_PROTOCOL)

a_dict在哪里

a_dict = 
{'8a50b9f75b57104d89b58305d96045df':[b'\x94*\x08\x9d\xd8', 0, 1, 4, 6, 7],
 'bff92f621cc65e2103305343a943c9a8':[b'\x85*\xe4\xf0\xd7', 2, 3, 5, 8, 9]}

同样,原始文件的内容和result是相同的。但是,当我与Unix cmp file1 file2比较时,甚至当我再次对文件进行哈希处理时,字节也不相同。

1 个答案:

答案 0 :(得分:0)

在做的时候:

for values_list in a_dict.values():

会迭代这些值,但顺序可以在后续运行之间更改。这是Python 3哈希(哈希随机化,请阅读:Why is dictionary ordering non-deterministic?)函数的一项安全功能,该功能会更改(除非您使用环境变量对其进行修复)。

因此,您得到的列表数据(在a_list中是相同的,但是顺序不同。我建议您在迭代以稳定它们时对这些值进行排序:

for values_list in sorted(a_dict.values()):

对于像您这样的本机python结构,我建议使用json对其进行序列化。您可能会自己发现问题,看到内容没问题,只是顺序不同。