使用Python cPickle嵌套循环

时间:2012-02-20 04:53:12

标签: python while-loop pickle

我希望能够有一系列使用相同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 个答案:

答案 0 :(得分:4)

内部循环仅在读取文件时遇到EOFError时停止,因此当您到达外部循环的第二次迭代时,您已经读取了整个文件。因此,尝试阅读更多内容只会为您提供另一个EOFError,而您已经离开了。

答案 1 :(得分:2)

首先,我应该说ben w的答案确实解释了你正在经历的行为。

至于你更广泛的问题“如何使用Python完成我的任务?”我建议只使用文件中的单个循环将所有pickle对象加载到内存中的数据结构中(ID为键的字典和文本值似乎是一种自然的选择)。加载完所有对象后,根本不会弄乱文件;只需使用内存中的数据结构。如果您愿意,可以使用现有的嵌套循环逻辑。它可能看起来像(伪代码)

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