2014-11-02 35 views
1

在我的腳本中,我試圖保存一個字典使用cPickle。一切正常,除了加載字典的東西有修改每個鍵。 我的字典裏是這樣的:{'a':[45,155856,26,98536], 'b':[88,68,9454,78,4125,52]...}cPickle保存的對象加載修改 - Python

當我從保存前本詞典打印鍵,它打印正確的值:'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',這是一個數字。

+2

如果將寫入模式從'w +'更改爲'wb +',會發生什麼? (由於'w +'是文本模式,在Windows上它會將'\ n'映射到'\ r \ n'。) – unutbu 2014-11-02 12:44:18

+0

@unutbu謝謝你的幫助!現在,它工作正常。 – 2014-11-02 12:47:02

回答

1

the docs

要以二進制 模式協議> = 1中創建一定要始終打開泡菜文件。對於舊的基於ASCII的pickle協議0,只要保持一致,就可以使用文本模式 或二進制模式。 (我的重點)

因此,不寫在文本模式w+的鹹菜文件,但在二進制模式rb閱讀。 而是使用二進制模式wb+rb


When you write in text mode(例如w+),\n被映射到結束線的特定於操作系統的字符(或多個)。在Windows上,\n映射到\r\n。這似乎是出現在密鑰中的錯誤\r的來源。

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]}