Skip to main content
 首页 » 编程设计

python之如何恢复损坏的、部分 pickle 的文件

2025年05月04日21cmt

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

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

这是我尝试过的:

>>> 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 内置类型组成。

请您参考如下方法:

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',)] 

pickle 数据格式并不那么复杂。通读 Python 模块的源代码,您可能会找到一种 Hook 所有 load_ 方法的方法,从而为您提供更多信息。