2012-02-20 3 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

Не понимаю. Изменен ли файл, когда вы идете? –

+0

Файл не редактируется, его просто читаем. – aeupinhere

+0

Маленький совет: часть использования 'with' для обработки файлов заключается в том, что файл автоматически закрывается в конце; нет необходимости явно закрывать его самостоятельно. Кроме того, поскольку 'файл' является встроенным Python, вам рекомендуется использовать другое имя (для этого обычно используется' f'). –

ответ

2

Во-первых, я должен сказать, что ответ ben w объясняет поведение, которое вы испытываете.

Что касается вашего более широкого вопроса «как выполнить свою задачу с помощью Python?» Я рекомендую просто использовать один цикл через файл для загрузки всех маринованных объектов в структуру данных в памяти (словарь с идентификаторами в виде ключей и текста, поскольку значения кажутся естественным выбором). Когда все объекты будут загружены, вы вообще не будете связываться с файлом; просто используйте структуру данных в памяти. Если хотите, вы можете использовать существующую логику вложенного цикла. Он может выглядеть примерно как (псевдокод)

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

В итоге я отказался от использования рассола и пошел с прямым доступом к базе данных. Для этого это было прекрасно. – aeupinhere

4

Внутренний цикл останавливается только при попадании на EOFError при чтении файла, поэтому к тому времени, когда вы дойдете до того, что было бы второй итерацией внешнего цикла, вы прочитали весь файл. Поэтому, пытаясь прочитать больше, вы просто получите еще один EOFError, и вы ушли.