如何恢复损坏的部分腌制文件?

时间:2018-03-11 17:17:49

标签: python pickle corruption dill

我的程序在使用dict将数据(dill)序列化到磁盘时被终止。我现在无法打开部分写入的文件。

是否可以部分或完全恢复数据?如果是这样,怎么样?

以下是我尝试的内容:

>>> dill.load(open(filename, 'rb'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lib/python3.4/site-packages/dill/dill.py", line 288, in load
    obj = pik.load()
EOFError: Ran out of input
>>> 

该文件不为空:

>>> os.stat(filename).st_size
31110059

注意:字典中的所有数据都由python内置类型组成。

1 个答案:

答案 0 :(得分:3)

pickle.Unpickler的纯Python版本即使遇到错误也会保持堆栈,所以你可能至少得到一些东西:

import io
import pickle

# Use the pure-Python version, we can't see the internal state of the C version
pickle.Unpickler = pickle._Unpickler

import dill

if __name__ == '__main__':
    obj = [1, 2, {3: 4, "5": ('6',)}]
    data = dill.dumps(obj)

    handle = io.BytesIO(data[:-5])  # cut it off

    unpickler = dill.Unpickler(handle)

    try:
        unpickler.load()
    except EOFError:
        pass

    print(unpickler.stack)

我得到以下输出:

[3, 4, '5', ('6',)]

泡菜数据格式并不复杂。阅读Python模块的源代码,您可以找到一种方法来挂钩所有load_方法,以便为您提供更多信息。