【问题标题】:Reverse process after finding duplicates找到重复项后的反向处理
【发布时间】:2018-08-05 19:35:30
【问题描述】:

我看到一些帖子在目录中查找重复项并进行压缩: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 比较时,甚至当我再次对文件进行哈希处理时,字节都不相同。

【问题讨论】:

  • 你可以尝试腌制加载这两个文件并进行比较吗?那会更清楚。或者使用json 转储您的数据,而不是pickle,这样您就可以看到为什么它们不同。
  • 要调试它,创建一个文件'aba.txt',其中每行是1023个'a'(或'b')字符,后跟换行符。然后使用diff -u aba.txt reconstructed.txt 了解南下的情况。另外,您提到尺寸不同。多少?是否可能存在一些 LF 与 CRLF 问题,或者一个文件是否以 unicode BOM 字节顺序标记开头?使用hexdump -C 验证详细信息。

标签: python arrays python-3.x


【解决方案1】:

当你在做的时候:

for values_list in a_dict.values():

这些值会被迭代,但顺序可以在后续运行之间改变。这是 Python 3 散列(散列随机化,在此处阅读:Why is dictionary ordering non-deterministic?)函数的一项安全功能,它会发生变化(除非您使用 env. 变量对其进行修复)。

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

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

对于像你这样的原生 python 结构,我建议使用json 来序列化它们。您可以自己解决问题,看到内容没问题,只是顺序不同。

【讨论】:

  • 我打印了originaloutput,然后使用差异检查器确认它们是相同的。我不认为问题出在字典上,因为我正在根据列表值进行重建。因此,列表中的值 01 返回两个相同的块,然后是 23 返回另外两个相同的块(与前一个不同)至于 json 我有问题我正在处理字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2016-04-11
  • 2019-11-04
  • 2016-11-13
相关资源
最近更新 更多