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

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

在我的脚本中,我试图使用cPickle保存字典。除了加载的字典对每个键进行了修改之外,其他一切都正常。 我的字典看起来像:
{'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感谢您的帮助!现在,它工作正常。