Подтвердить что ты не робот

Ошибка травления в python?

Я получаю эту ошибку, и я не знаю, что это значит. Как я могу исправить эту проблему?

мой код выглядит так, я использовал его раньше, и он сработал:

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'
4b9b3361

Ответ 1

Эта точная ошибка произошла для меня, когда я попытался раскрыть (используя pickle.loads) строковое представление, которое я хранил в базе данных через django. Django изменил представление charactee моей строки так, чтобы pickle.loads(mystring) выбросил мне эту ошибку. Когда я добавил явное преобразование строки, это было прекрасно: pickle.loads( str(mystring) )

РЕДАКТИРОВАТЬ: глядя на комментарии к исходному сообщению, я думаю, что это связано с упомянутой проблемой строки в Юникоде. Я помещаю нормальную строку в базу данных, а django возвращает строку unicode, которая вызывает эту ошибку.

Ответ 2

У меня была аналогичная проблема, в результате получилось KeyError: '\x1f'.

В моем случае, если был маринован в файл gzip (т.е.: gzip.open(fileName,'wb')), и я пытался прочитать его с обычным файловым объектом (например: open(fileName,'rb')).

Ответ 4

Рассол является двоичным, поэтому вы должны прочитать его как таковой. Вместо ('r') попробуйте использовать ('rb') чтение двоичного кода. Кроме того, если вы пишете файл, убедитесь, что вы забираете файл pickle как двоичный ('wb'). Это должно работать, надеюсь, что это поможет.

Ответ 5

Возможно, вам стоит попробовать другой протокол try pickle.load(in1, 2)!

Ответ 6

Я столкнулся с той же проблемой, когда пытался автоматизировать заполнение данных в django. Проблема в том, что могут существовать некоторые скрытые не-pkl файлы, такие как ".DS_Store". Итак, если это так, вы можете справиться с этой проблемой, добавив фильтр регулярных выражений перед загрузкой, чтобы просто получить файлы "pkl":

import re

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))
        reg = re.compile(r'pkl')
        for f in file_list:
            if reg.search(f):
                in1 = open(f, 'r')
                dict2 = pickle.load(in1)