Проблема с использованием cPickle - PullRequest
1 голос
/ 14 февраля 2010

Не могли бы вы помочь мне сделать этот пример работы?

Я бы хотел загрузить сериализованный dict, если он существует, изменить его и вывести снова. Я думаю, что у меня проблема с режимом, который я использую для открытия файла, но я не знаю правильный путь.

import os
import cPickle as pickle

if os.path.isfile('file.txt'):
    cache_file = open('file.txt', 'rwb')
    cache = pickle.load(cache_file)
else:
    cache_file = open('file.txt', 'wb')
    cache = dict.fromkeys([1,2,3])

# modifications of cache

pickle.dump(cache, cache_file)
cache_file.close()    

Запустите его дважды, чтобы увидеть ошибку:

Traceback (most recent call last):
  File "example.py", line 11, in <module>
    pickle.dump(cache, cache_file)
IOError: [Errno 9] Bad file descriptor

Ответы [ 3 ]

5 голосов
/ 14 февраля 2010

'rwb' неверный режим открытия файла для open(). Попробуйте 'r+b'.

И после того, как вы прочитали из файла, вы поместили курсор в конец файла, поэтому pickle.dump(cache, cache_file) добавит к файлу (что, вероятно, не то, что вы хотите). Попробуйте cache_file.seek(0) после pickle.load(cache_file).

4 голосов
/ 14 февраля 2010

Для каждой загрузки вам нужно открыть (с mode = 'rb'), загрузить и закрыть дескриптор файла.
Для каждого дампа вам нужно открыть (с mode = 'wb'), сбросить и закрыть дескриптор файла.

1 голос
/ 14 февраля 2010

Вы открыли файл для чтения и записи - т.е. произвольный доступ. Когда вы сначала читаете файл, вы оставляете позицию индекса файла в конце файла, поэтому, когда вы позже записываете данные обратно, вы добавляете этот файл.

Вам следует открыть файл в режиме чтения, прочитать данные, закрыть его, а затем снова открыть в режиме записи.

...