Я использую pickle для сериализации списка объектов, шифрую сериализованную строку, а затем использую pickle, чтобы выгрузить ее в файл, чтобы позже можно было прочитать ее в обратном порядке.Я понимаю, что это может быть обходной путь, но теоретически я не могу понять, почему при перезагрузке данных он продолжает давать сбой.Позвольте мне сначала извиниться за мои ужасные соглашения об именах, когда однажды они улучшатся.
Я выкинул приведенный ниже код, ошибка возникает только в самом конце при загрузке данных обратно в список и завершается со следующей ошибкой:
Traceback (most recent call last):
File "servertest.py", line 453, in <module>
mylist = mary1.ReadFromFile()
File "servertest.py", line 142, in ReadFromFile
mrylist = pickle.loads(datastring)
File "C:\Python27\lib\pickle.py", line 1388, in loads
return Unpickler(file).load()
File "C:\Python27\lib\pickle.py", line 864, in load
dispatch[key](self)
KeyError: '\xa7'
Я распечатывал данные на каждом шаге при вызове функций записи и чтения, и это нормально:
Это необработанные данные
]q ((c__main__
User
q☺oq☻}q♥(U☻idq♦U♦daveq♣U♥pinq♠U☻22qub(h☺o}q (h♦U♦maryq
h♠U♥434q♂ube.
этоэто зашифрованные данные
'▼ES╬NZ┴w▲sæô▄Hó^┴☻½K◄6►ëΘ░¡√╡▼/ⁿ♀*a]ì╡
5åα¬δ⌡D╓£o¶α{ô √■♣í♠.|H^E«√☼Hwñ/cúw╠Σ√↔↔╞╞┼3
это кодированные данные
'▼ES╬NZ┴w▲sæô▄Hó^┴☻½K◄6►ëΘ░¡√╡▼/ⁿ♀*a]ì╡
5åα¬δ⌡D╓£o¶α{ô √■♣í♠.|H^E«√☼Hwñ/cúw╠Σ√↔↔╞╞┼3
незашифрованные данные
]q ((c__main__
User
q☺oq☻}q♥(U☻idq♦U♦daveq♣U♥pinq♠U☻22qub(h☺o}q (h♦U♦maryq
h♠U♥434q♂ube.
Ниже показаны две функции, которые я использую:
def WriteToFile(self, mrlist):
self.mrlist = mrlist
rawdata = pickle.dumps(mrlist, 1)
#print 'rawdata1\n' + rawdata
#encrypt pickled list (call on my encryption functions)
encrydata = self.encryptmessage.EncrMsg(rawdata)
print('this is encrypt data \n ' + encrydata)
#Open and dump encrypted string to file
file=open(self.fn,"wb")
pickle.dump(encrydata, file, 1)
file.close()
#Function to call when reading the file
def ReadFromFile(self):
mrylist = []
#open file and load
file = open(self.fn, "rb")
encdata = pickle.load(file)
file.close
print('this is enc data*********\n ' + encdata)
#Decrypt the string
datastring = self.encrytmessage.DeCryptMsh(encdata)
print 'unencrypted data' + datastring
mrylist = pickle.loads(datastring)
return mrylist`
Редактировать: ниже показан простой пользовательский класс для тех, кому интересно посмотреть, что содержит список:
class User:
def __init__(self, id, pin):
self.id = id
self.pin = pin
def getpair(self):
return ' %s " | " %s ' % (self.id, self.pin)
def edit_pin(self, pin1):
self.pin = pin1