Вложенные циклы с Python cPickle - PullRequest
2 голосов
/ 20 февраля 2012

Я хотел бы иметь возможность иметь ряд вложенных циклов, использующих один и тот же файл pickle. Смотрите ниже:

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 выполняет что-то подобное. Проблема в том, что оно ограничено в том, что подвергается Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

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

2 голосов
/ 20 февраля 2012

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

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

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