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

发布于 2021-01-29 15:04:52

我的程序在使用序列化数据(a 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内置类型组成。

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    纯Python版本的,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_方法的方法,以为您提供更多信息。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看