使用Python cPi的嵌套循环

2024-09-30 08:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够有一系列嵌套循环使用同一个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模块执行的任何类似的操作都比不上。问题是,它只限于暴露的内容。谁能给我指出正确的方向吗?在


Tags: 文件textiddatamainaspicklefile
2条回答

内部循环只有在读取文件时碰到EOFError时才会停止,所以当您到达第二次外循环迭代时,您已经读取了整个文件。所以,如果你想多读一点,你就会被淘汰。在

首先,我应该说本·w的回答确实解释了你所经历的行为。在

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

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

相关问题 更多 >

    热门问题