【问题标题】:Python 3.6 - Save dictionary containing type 'bytes' to file [duplicate]Python 3.6 - 将包含“字节”类型的字典保存到文件中[重复]
【发布时间】:2019-01-12 07:26:21
【问题描述】:

我正在开展一个项目,我在该项目中识别二进制文件中所有唯一出现的固定大小块,然后保存并将结果保存到二进制文件中(它需要跨多种语言工作)。

我的方法如下:我读取文件的每个块,散列,并将唯一的散列和二进制代码存储到字典中。每次程序看到重复的散列时,它都会附加该位置以供以后重建。结果字典的示例如下所示:

dict = {'d59fce39b5d8d4b278acbf2f5be0353c': [b'\xc5\xd7\x14\x84', 0, 1, 4],
        'bf937a85a0f950f431a4c9c1aeca8686': [b'\x08\xe7\x07\x8f', 2, 3, 5]}

然后,我使用 with open('out.data, 'wb') as f: 将文件保存到磁盘 (f.write(dict)),但出现以下错误:

TypeError: a bytes-like object is required, not 'dict'

我在这里找到的其他解决方案对我没有帮助。我尝试按照here 的建议将字典传递给 JSON 对象,但得到了:

new_dict = json.dumps(dict)

TypeError: Object of type 'bytes' is not JSON serializable

我正在处理任意字节,因此,编码似乎不是解决此问题的方法。

【问题讨论】:

  • b'\xc5\xd7\x14\x84 这样的bytes 字符串可以很容易地转换为十六进制,就像哈希值一样。但我很好奇,这些字节字符串和二进制文件中固定大小的块之间有什么联系?可能有一种更有效的方式来存储这些数据。您通常会为每个块找到多少个重复位置?
  • 顺便说一句,使用dict 作为变量名不是一个好主意,因为这会影响内置的dict 类型。
  • FWIW:JSON 中的“字节数组”通常是 Base64 编码的。这是额外的编码是有效的,如果不是总是[足够]有效。

标签: python python-3.x dictionary


【解决方案1】:

你试过了吗

import pickle

with open('out.pickle', 'wb') as f:
    pickle.dump(dict, f, protocol=pickle.HIGHEST_PROTOCOL)

with open('out.pickle', 'rb') as f:
    b_dict = pickle.load(f)

# This is to check that you saved the same dict in memory
print dict == b_dict

【讨论】:

  • wb 表示文件以二进制方式打开写入。
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 2013-10-27
  • 2011-08-17
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多