我的程序在使用序列化数据(a dict)到磁盘时被杀死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内置类型组成。
纯Python版本的,pickle.Unpickler即使遇到错误也会保持堆栈,因此您至少可以从中获得一些收益:
pickle.Unpickler
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_方法的方法,以为您提供更多信息。
load_