2011-06-08 4 views
2

У меня вопрос о хранении данных. У меня есть программа, которая создает список объектов. Каков наилучший способ сохранить их в файле, чтобы программа могла перезагрузить их позже? Я пытался использовать маринованные, но я думаю, что я мог бы быть заголовок вниз неправильный переулок и я получаю эту ошибку, когда я пытаюсь прочитать обратно данные:Новое на Python (Программирование) и хранение данных

Traceback (most recent call last): 
    File "test.py", line 110, in <module> 
knowledge = pickle.load(open("data.txt")) 
    File "/sw/lib/python3.1/pickle.py", line 1356, in load 
encoding=encoding, errors=errors).load() 
File "/sw/lib/python3.1/codecs.py", line 300, in decode 
(result, consumed) = self._buffer_decode(data, self.errors, final) 
    UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte 

Отредактировано добавить: вот немного из код пытаюсь:

FILE = open("data.txt", "rb") 

knowledge = pickle.load(open("data.txt")) 

FILE = open("data.txt", 'wb') 

pickle.dump(knowledge, FILE) 
+1

Какая версия Python? Как вы создали файл? – delnan

+0

Как вы их спасли? – Nix

+0

Повторить травление. Внимательно прочитайте документацию! Отправьте здесь код, и мы поможем вам найти, что не так :). Вы также можете использовать JSON, для этого есть несколько модулей. – slezica

ответ

0

Если вы просто хотите, чтобы воссоздать некоторые объекты класса позже, самым простым решением было бы сбросить свои свойства в файл и их прочитать их, создавая объекты на основе содержание.

См: http://docs.python.org/tutorial/inputoutput.html

+0

Нет, это непросто. Многое набирает и нарушает DRY (и, следовательно, также несет риск выхода из синхронизации). – delnan

+0

Структура данных довольно сложная. Статья, с которой вы связывались, советует не делать вручную, а предлагает рассол. Есть ли у вас какие-либо идеи, что может привести к моей ошибке? – CGPGrey

-1

Вы можете использовать cPickle или Picke это не имеет значения. Откройте в двоичном режиме (rb) и попробуйте установить протокол на -1.

попробовать что-то вроде этого:

import cPickle 

my_file= open('wohoo.file', 'wb') 

largeObject= Magic() #insert your logic here 
cPickle.dump(largeObject, my_file, -1) 
my_file.close() 

other_file = open('wohoo.file', 'rb') 
welcomeBack - cPickle.load(other_file) 
other_file.close() 
+0

-1 Неправильно, читайте снова. Он находит файл. Он может даже прочитать его. Он просто не может декодировать его в кодировке, которую предпочитает Python. – delnan

9

Я думаю, что проблема в том, что линия

knowledge = pickle.load(open("data.txt")) 

не открывает файл в двоичном режиме. Python 3.2:

>>> import pickle 
>>> 
>>> knowledge = {1:2, "fred": 19.3} 
>>> 
>>> with open("data.txt", 'wb') as FILE: 
...  pickle.dump(knowledge, FILE) 
... 
>>> knowledge2 = pickle.load(open("data.txt")) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte 
>>> knowledge2 = pickle.load(open("data.txt","rb")) 
>>> knowledge2 
{1: 2, 'fred': 19.3} 
1

Нет необходимости переписывать shelve, библиотеку персистентности объектов языка Python. Пример:

import shelve 

d = shelve.open(filename) # open -- file may get suffix added by low-level 
          # library 

d[key] = data # store data at key (overwrites old data if 
       # using an existing key) 
data = d[key] # retrieve a COPY of data at key (raise KeyError if no 
       # such key) 
del d[key]  # delete data stored at key (raises KeyError 
       # if no such key) 
flag = d.has_key(key) # true if the key exists 
klist = d.keys() # a list of all existing keys (slow!) 

# as d was opened WITHOUT writeback=True, beware: 
d['xx'] = range(4) # this works as expected, but... 
d['xx'].append(5) # *this doesn't!* -- d['xx'] is STILL range(4)! 

# having opened d without writeback=True, you need to code carefully: 
temp = d['xx']  # extracts the copy 
temp.append(5)  # mutates the copy 
d['xx'] = temp  # stores the copy right back, to persist it 

# or, d=shelve.open(filename,writeback=True) would let you just code 
# d['xx'].append(5) and have it work as expected, BUT it would also 
# consume more memory and make the d.close() operation slower. 

d.close()  # close it 
Смежные вопросы