【问题标题】:pickling error in python?python中的酸洗错误?
【发布时间】:2011-06-13 14:38:43
【问题描述】:

我收到此错误,但我不知道它是什么意思。我该如何解决这个问题?

我的代码看起来是这样的,我以前用过它,它已经工作了:

parentdir = os.getcwd()
dirlist = os.listdir(parentdir)

for dir in dirlist:
    if not dir == "pubs_edits": continue
    if os.path.isdir(os.path.join(parentdir, dir)):
                        os.chdir(os.path.join(parentdir, dir))
                        file_list = os.listdir(os.path.join(parentdir, dir))
                        for f in file_list:
                            in1 = open(f, 'r')
                            dict2 = pickle.load(in1)

这是错误信息:

    File "/home/md202/pmid_editor.py", line 18, in <module>
        dict2 = pickle.load(in1)
    File "/usr/lib/python2.5/pickle.py", line 1370, in load
        return Unpickler(file).load()
    File "/usr/lib/python2.5/pickle.py", line 858, in load
        dispatch[key](self)
KeyError: '\x00'

【问题讨论】:

  • 请提供完整的提示......这是您自己的代码吗?如何繁殖?
  • 你在解压什么?如果它是您定义的类的实例,您是否导入了该类?
  • 我正在解开我腌制到文件中的字典。
  • in1 的值是多少?打印出来看看。看起来那里可能有一些 Pickle 不喜欢的 unicode 字符
  • 您似乎正在尝试加载目录的所有内容,其中可能包含一个不包含腌制数据的文件。

标签: python pickle


【解决方案1】:

当我尝试取消(使用pickle.loads)我通过django存储在数据库中的字符串表示时,我发生了这个确切的错误。 Django 更改了我的字符串的字符表示,因此pickle.loads(mystring) 向我抛出了那个错误。当我在其中添加显式字符串转换时,很好:pickle.loads( str(mystring) )

编辑:查看原始帖子上的 cmets,我认为这与提到的 unicode 字符串问题有关。我将一个普通字符串放入数据库,django 给我返回一个产生此错误的 unicode 字符串。

【讨论】:

  • 您的回答对我的问题有所帮助。当我应该使用 db.Blob() 时,我正在使用应用程序引擎并将腌制字符串存储为 db.Text() 属性
  • 谢谢马特,我有你指定的确切错误,我试图使用 Django 将它保存在数据库中,并在取消对象时得到这个错误。
  • 大概这个错误不会出现在 Python 3+ 上?
【解决方案2】:

我遇到了类似的问题,导致KeyError: '\x1f'

在我的例子中,如果被腌制为一个 gzip 文件(即:gzip.open(fileName,'wb')),我试图用一个普通的文件对象(即:open(fileName,'rb'))来读取它。

【讨论】:

  • 似乎腌制文件与 gzip 一起玩很棘手。我的腌制文件看起来像一个 gzip(根据“文件”),但是当我尝试对其进行压缩时,它返回了一个很小(从 200M 到 10K)的残缺文件,其中没有有用的数据(pickle.load 给出了相同的 KeyError: '\x00' 问题与此类解压缩文件有关。
  • 文件看起来不完整或损坏。如果它是以文本格式腌制的,你可以看看zcat myfile——它看起来合理吗?
  • 它可能已损坏,我尝试重新生成它,加载时不再出现错误
【解决方案3】:

Pickle 是二进制的,所以你必须这样阅读它。代替 ('r') 尝试使用 ('rb') 读取二进制文件。此外,如果您编写文件,请确保您将 pickle 文件也写入二进制文件('wb')。应该可以的,希望对你有帮助。

【讨论】:

  • 不知道为什么你被否决了,这就是我一直在寻找的答案。容易犯的错误!
【解决方案4】:

【讨论】:

  • 在我的一生中,我无法理解为什么这会为我解决这个问题。
【解决方案5】:

也许您应该尝试其他协议尝试pickle.load(in1, 2)

【讨论】:

  • 查看模块文档link,加载函数采用一个可选参数,该参数定义了数据的腌制方式。
  • 根据文档,load() 没有可选参数,只有 dump 有。
猜你喜欢
  • 2011-04-01
  • 2014-09-15
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多