2010-02-14 5 views
1

Не могли бы вы помочь, чтобы этот exmaple работал?Проблема с использованием cPickle

Я хотел бы загрузить сериализованный 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 

ответ

4

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

5

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

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

1

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

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

Смежные вопросы