假设我有一个泡菜转储——无论是作为一个文件还是一个字符串——我如何确定用于自动创建泡菜转储的协议?
如果是这样,我是否需要阅读整个转储来找出协议,还是可以在 O(1) 中实现?通过 O(1),我考虑了 pickle 字符串或文件开头的一些标头信息,其读出不需要处理整个转储。
非常感谢!
编辑:我对此有一个更新,显然下面给出的答案在python 3.4下并不总是有效。如果我只是True用协议 1腌制值,有时我只能恢复协议 0 :-/
您可以使用picketools以下方法推出自己的产品:
with open('your_pickle_file', 'rb') as fin:
op, fst, snd = next(pickletools.genops(fin))
proto = op.proto
Run Code Online (Sandbox Code Playgroud)
似乎 PROTO 标记只写为协议为 2 或更大的第一个元素。否则,第一个元素是一个标记或元素,指示协议是 0 还是 1。
更新到拼凑更多土地:
pops = pickletools.genops(pickle_source)
proto = 2 if next(pops)[0].proto == 2 else int(any(op.proto for op, fst, snd in pops))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1991 次 |
| 最近记录: |