当前位置: 首页 > 面试题库 >

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

甄志
2023-03-14
问题内容

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


问题答案:

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



 类似资料:
  • 昨天我使用Xampp创建了一些简单的基于Web的实用工具。今天我想继续工作,但xampp控制面板给了我一些错误。 这是MySQL错误日志: 已经尝试过修复,但mySQL服务甚至无法启动,所以我有点无助。。。

  • 我们正在使用Apache Camel(Camel 2.10.3,Java基于DSL)构建一个集成项目。 我们有一个路由,每天从数据库中提取数据(让我们称之为IN_DB),执行一些逻辑并插入另一个数据库(OUT_DB),另一个路由订阅XML数据的JMS主题,执行一些逻辑并全天插入同一个数据库(OUT_DB)。 需求是,当JMS主题连接因任何原因中断时,我们会一直尝试无限期地重新连接,一旦重新连接成功

  • 问题内容: 我使用Eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它说jar文件无效或损坏。谁能建议我为什么jar文件无效? 问题答案: 当您在Windows资源管理器中双击一个JAR文件时,会发生这种情况,但是JAR本身实际上不是 可执行的 JAR。真正的可执行JAR至少应具有带有方法的类,并在中引用它。 在Eclispe中,您需要将项目导出为 Runnabl

  • 问题内容: 我正在使用apache commons http客户端使用post方法来调用url来发布参数,并且很少抛出以下错误。 有人可以建议导致此异常的原因以及如何对其进行调试吗? 问题答案: 原因是: 最通常的是,在另一端已经关闭连接时写入连接; 通常,对等方关闭连接而不读取其末端已经挂起的所有数据。 因此,在两种情况下,你的应用程序协议定义或实施都不充分。 还有第三个原因,我在这里不做记录,

  • 我创建了代码,将图像添加到现有的pdf文档中,然后对其进行签名,全部使用PDFBox(参见下面的代码)。 代码很好地添加了图像和签名。但在一些文档中,Acrobat Reader抱怨“签名字节范围无效”。 问题似乎与本题描述的问题相同。这个问题的答案更详细地描述了这个问题:问题是我的代码在文档中留下了交叉引用类型的混合(流和表)。事实上,有些文档甚至不会打开,因为这样会产生问题。 我的问题是:我如

  • 朋友们,这是我在这里的第一个问题。。。我在使用MS2XML下载PDF缓冲区时遇到了一些问题。XMLHTTP。我一直在使用Genexus这样做,但我也尝试了纯视觉福克斯专业版。问题是,当我将ResponseText发送到字符串变量时,一些字符被问号替换,sam发生在我将ResponseText发送到pdf或txt文件时。在MS2XML中创建的对象。XMLHTTP。6.0不允许使用ResponseBy