python嵌套for循环不会先执行

时间:2016-12-12 16:10:59

标签: python python-3.x for-loop nested nested-loops

此脚本用于读取文件并接收数字(numA)及其旁边的文本(sourceA)。然后它使用它并将其与文件中的每个其他行进行比较。如果找到“nums”中的匹配但不在源中,则将num写入文件及其出现的源。

with open(sortedNums, "r")as sor:
for line in sor:
    NumsA, sourceA = line.split('####')
    for line in sor:
        if '####' in line:
            NumsB, sourceB = line.split('####')
            if (NumsA == NumsB) & (sourceA != sourceB):
                print("Found reused Nums")
                with open(reusedNums, 'a')as reused:
                    reused.write(NumsA + ' ' + sourceA + ' ' + sourceB)
            print ("setA: " + NumsA + ' ' + sourceA)
            print ("setB: " + NumsB + ' ' + sourceB)

除了它完整的内部循环但只进行外部循环的第一次迭代

之外,其中大多数都有效。

1 个答案:

答案 0 :(得分:1)

您正尝试从同一文件中读取两次。文件使用当前位置来确定接下来要读取的内容,并迭代内部循环中的其余行,您将该位置一直移动到最后。

您可以通过以下方式回复文件的开头来“修复”:

sor.seek(0)

但是,为该文件中的每一行循环遍历整个文件效率非常低。使用字典跟踪您是否在上一行中看到过相同的信息:

with open(sortedNums, "r")as sor, \
     open(reusedNums, 'a') as reused:
    seen = {}
    for line in sor:
        if not '####' in line:
            continue
        nums, source = line.rstrip().split('####')
        if nums in seen and seen[nums] != source:
            print("Found reused Nums")
            reused.write('{} {} {}\n'.format(nums, source, seen[nums]))
        seen[nums] = source

通过将数据存储在字典中,您只需要遍历文件一次