【发布时间】:2018-06-12 09:16:05
【问题描述】:
我正在使用 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'
在调用 write 和 read 函数时,我在每一步都将数据打印出来,看起来没问题:
这是原始数据
]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
【问题讨论】:
-
代码充满了错误。
datastring = self.encrytmessage.DeCryptMsh(encdata),file.close, 你为什么使用 pickle 来写入/读取文件的消息(而不是file.write/file.read)?User类(以及您要处理的实例)是什么样的? -
嗨,我已经用 User 类更新了帖子。我最终将使用 file.write,我希望它可以解决我遇到的问题,但我会坚持尝试找出问题的真正含义。我已经使用 Python 一个多星期了,似乎我在这里遗漏了一些非常简单的东西。
-
[SO]: How to create a Minimal, Complete, and Verifiable example (mcve)。未加密/解密的数据似乎是相同的(我没有彻底检查)。尝试消除不相关的部分,例如加密,文件等。尝试在之后立即对对象进行酸洗和取消酸洗。如果问题重现,只需放置该代码,并创建对象。
标签: python python-2.7 pickle