gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:14 27 4
gpt4 key购买 nike

我的程序在使用 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_ 方法以提供更多信息。

关于python - 如何恢复损坏的、部分 pickle 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53409736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com