此脚本用于读取文件并接收数字(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)
除了它完整的内部循环但只进行外部循环的第一次迭代
之外,其中大多数都有效。答案 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
通过将数据存储在字典中,您只需要遍历文件一次。