cPickle保存的对象已加载修改 - Python

时间:2014-11-02 12:08:03

标签: python dictionary pickle

在我的脚本中,我尝试使用 cPickle 保存字典。一切正常,除了加载字典修改每个键的东西。 我的字典看起来像是:{'a':[45,155856,26,98536], 'b':[88,68,9454,78,4125,52]...}

在保存之前从我的字典中打印密钥时,它会打印正确的值:'a','b'...

但是当我保存它然后使用 cPickle 加载时,每个键在正确的char之后包含'\r''a\r','b\r'...

以下是保存代码:

def saveSuffixArrayDictA():
        for i in self.creation.dictA.keys():
            print len(i)
        print 'STOP'
        with open('dictA','w+') as f:
            pickle.dump(self.creation.dictA,f)

打印:1,1,1,1,1,1....STOP(当然还有换行符)

然后,当我尝试使用它加载它时:

@staticmethod
def dictA():
    with open('ddictA','rb') as f:
        dict = pickle.load(f)
    for i in dict.keys():
        print len(i)
    print 'STOP'
    return dict

它返回:2,2,2,2,2,2,2,2...STOP(当然还有换行符)

你可以看到它应该是一样的但它不是......问题可能出在哪里?

编辑:我试图打印数值,并意识到列表中的每个项目(列表都是值)已经添加了' L'在这个项目的最后是一个数字。

2 个答案:

答案 0 :(得分:1)

这是一个非常奇怪的错误,我不知道它的原因。但这是另一种在python中保存和加载数据结构的方法。只需使用str()将您的数据结构转换为字符串,然后将其写入任何file。加载file,在任何变量中读取它,然后使用ast将其转换回数据结构。演示如下:

>>> import ast
>>> d={'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10]}
>>> saveDic=str(d)
>>> saveDic
"{'a': [1, 2, 3, 4], 'c': [9, 10], 'b': [5, 6, 7, 8]}"
# save this string to any file, load it back and convert to dictionary using ast
>>> d=ast.literal_eval(saveDic)
>>> d
{'a': [1, 2, 3, 4], 'c': [9, 10], 'b': [5, 6, 7, 8]}

答案 1 :(得分:1)

the docs

  

请务必始终打开使用二进制协议> = 1创建的pickle文件   模式。对于旧的基于ASCII的pickle协议0,您可以使用任一文本模式   或二进制模式只要您保持一致。 (我的重点)

因此,不要在文本模式w+中编写pickle文件,而是以二进制模式rb读取它。 相反,请使用二进制模式wb+rb


When you write in text mode(例如w+),\n映射到特定于操作系统的行尾字符。在Windows上,\n映射到\r\n。这似乎是出现在密钥中的错误\r的来源。