python中的酸洗错误?

时间:2011-06-13 14:38:44

标签: python pickle

我收到了这个错误,我不知道这意味着什么。我该如何解决这个问题?

我的代码看起来像这样,我以前使用它并且它已经工作了:

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'

5 个答案:

答案 0 :(得分:13)

当我尝试使用pickle.loads(通过django存储在数据库中)的字符串表示时,发生了这个确切的错误。 Django更改了我的字符串的charactee表示,以便pickle.loads(mystring)把这个错误告诉了我。当我添加显式字符串转换时,它很好:pickle.loads( str(mystring) )

编辑:查看原帖的评论,我认为这与提到的unicode字符串问题有关。我把一个普通的字符串放入数据库,django给了我一个产生这个错误的unicode字符串。

答案 1 :(得分:4)

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

在我的情况下,如果被腌制到gzip文件(即:gzip.open(fileName,'wb')),我试图用普通文件对象(即:open(fileName,'rb'))读取它。

答案 2 :(得分:1)

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

也许你应该尝试另一种协议试试pickle.load(in1, 2)