繁体   English   中英

Python Pickle,返回列表时的加载问题

[英]Python Pickle, Loading Issue when returning to list

我正在使用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

这是enc数据

  '▼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

解决方案我设法进行了排序,我的原始方法运行良好,实际上,泡菜根本不是问题。 看来,调用解密函数时的初始化向量与最初加密时的初始化向量不同。 解密发生时,它仍然产生相同的字符串,但必须包含一些我看不到的差异。 我重写了ReadWrite类,以使用读写功能,而不是使用pickle将序列化/加密的列表转储到文件中。 我也已经开始将IV写入外部,以便下次程序加载时可以通过解密方法读取它。 感谢您提供的任何帮助和建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM