【问题标题】:Python Pickle, Loading Issue when returning to listPython Pickle,返回列表时加载问题
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多