在我的脚本中,我尝试使用 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'在这个项目的最后是一个数字。
答案 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
的来源。