cPickle已保存加载的对象已修改-Python
在我的脚本中,我试图使用cPickle保存字典。除了加载的字典对每个键进行了修改之外,其他一切都正常。 我的字典看起来像:cPickle已保存加载的对象已修改-Python,python,dictionary,pickle,Python,Dictionary,Pickle,在我的脚本中,我试图使用cPickle保存字典。除了加载的字典对每个键进行了修改之外,其他一切都正常。 我的字典看起来像:{'a':[45155856,2698536],'b':[88,689454,784125,52]…} 当我在保存前打印此字典中的键时,它会打印正确的值:'a'、'b'… 但是当我保存它,然后使用cPickle加载时,每个键在正确的字符后面都包含'\r':'a\r','b\r'… 以下是保存的代码: def saveSuffixArrayDictA(): fo
{'a':[45155856,2698536],'b':[88,689454,784125,52]…}
当我在保存前打印此字典中的键时,它会打印正确的值:'a'、'b'…
但是当我保存它,然后使用cPickle加载时,每个键在正确的字符后面都包含'\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”,这是一个数字。这是一个非常奇怪的错误,我不知道其原因。但这里有另一种在python中保存和加载数据结构的方法。只需使用
str()
将数据结构转换为字符串,并将其写入任何文件
。加载文件
,在任何变量中读取该文件,并使用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]}
Per:
确保始终以二进制格式打开协议>=1创建的pickle文件
模式对于旧的基于ASCII的pickle协议0,您可以使用任一文本模式
或二进制模式,只要保持一致即可。(我的重点)
因此,不要以文本模式w+
写入pickle文件,而是以二进制模式rb
读取它。
相反,使用二进制模式,wb+
和rb
(例如,
w+
),\n
映射到操作系统特定的行尾字符。在Windows上,\n
映射到\r\n
。这似乎是键中出现错误的\r
的原因。如果将写入模式从w+
更改为wb+
,会发生什么情况?(由于w+
是一种文本模式,因此在Windows上它将\n
映射到\r\n
)@unutbu感谢您的帮助!现在,它工作正常。