2012-02-20 44 views
2

我想能夠有一系列使用相同的pickle文件的嵌套循環。見下文:與Python cPickle的嵌套循環

def pickleRead(self): 
    try: 
     with open(r'myfile', 'rb') as file: 
      print 'Reading File...' 
      while True: 
       try: 
        main = pickle.load(file) 
        id = main[0] 
        text = main[1] 
        while True: 
         try: 
          data = pickle.load(file) 
          data_id = data[0] 
          data_text = data[1] 
          coefficient = Similarity().jaccard(text.split(),data_text.split()) 
          if coefficient > 0 and data_text is not None: 
           print str(id) + '\t' + str(data_id) + '\t' + str(coefficient) 
         except EOFError: 
          break 
         except Exception as err: 
          print err 
       except EOFError: 
        break 

      print 'Done Reading File...' 
     file.close() 
    except Exception as err: 
     print err 

第二(內)循環運行而沒有任何問題,但第一個只是做單次迭代,然後停止。我試圖一次抓住一行,然後將它與文件中的每一行進行比較。有幾千行,我發現cPickle模塊執行任何類似的操作。問題在於它暴露的內容有限。任何人都可以將我指向正確的方向嗎?

+0

我不明白。文件是否隨着你的修改而被修改? – 2012-02-20 05:04:51

+0

該文件未被編輯,只是只讀。 – aeupinhere 2012-02-20 05:21:38

+0

小提示:使用'with'進行文件處理的一部分是該文件在最後自動關閉;沒有必要自己關閉它。另外,由於'file'是內置的Python,因此建議使用不同的名稱(爲此目的使用'f'是很常見的)。 – 2012-02-20 05:58:49

回答

2

首先,我應該說本w的答案確實解釋了你正在經歷的行爲。

至於你更廣泛的問題,「我該如何使用Python完成我的任務?」我建議在文件中使用單循環將所有pickled對象加載到內存中的數據結構中(ID爲鍵和文本爲值的字典似乎是一種自然選擇)。一旦所有對象都被加載完畢,你根本就不會弄亂文件;只需使用內存中的數據結構即可。如果你喜歡,你可以使用你現有的嵌套循環邏輯。它可能看起來像(僞代碼)

for k1 in mydict: 
    for k2 in mydict: 
     if k1 != k2: 
      do_comparison(mydict[k1], mydict[k2]) 
+0

我最終取消了泡菜的使用,並採用了直接的數據庫方法。這工作得很好。 – aeupinhere 2012-02-21 01:21:01

4

內部循環只有在讀取文件時碰到EOFError纔會停止,所以等到外層循環的第二次迭代時,您已經讀取了整個文件。所以試圖閱讀更多隻是給你另一個EOFError,你出去了。