我希望能够有一系列使用相同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模块执行任何类似的操作。问题在于暴露的内容有限。有人能指出我正确的方向吗?
答案 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])