我试图在Python中比较A和C两个文件,但由于某些原因double for循环似乎无法正常工作:
with open(locationA + filenameC,'r') as fileC, open(locationA + filenameA,'r') as fileA:
for lineC in fileC:
fieldC = lineC.split('#')
for lineA in fileA:
fieldA = lineA.split('#')
print 'UserID Clicks' + fieldC[0]
print 'UserID Activities' + fieldA[0]
if (fieldC[0] == fieldA[0]) and (fieldC[2] == fieldA[2]):
print 'OK'
在这里,似乎只比较了C的行,但是对于其他行,“A循环”似乎被忽略了。在
有人能帮我吗?在
您正在比较FileA中的所有行与FileC中的每一行。这意味着,对于文件C的每一行,您将读取整个文件A,并且(如果您确实将指针移动到文件A的开头),您将反复读取它。在
当它们都有线条时,更容易同时阅读它们 如果他们是一样的,做点什么,从两者中读一读
如果它们不同,从最小值读取(行A<;行C,仅从文件A读取;行C<;行A,仅从C行读取)
你不知道每行有两个循环,每行循环一行
嵌套循环的问题(从当前问题的角度来看)正是因为外部循环的每次迭代都会运行到内部循环完成。因此,相反,通过从
fileA
迭代器显式调用下一项来设置lineA
:一旦
fileC
耗尽,此逻辑将忽略fileA
中的任何额外行,并且如果fileC
包含的行数超过FileA
则如果不进行特殊检查,则事物也可能变得丑陋。在另一种方法可能使用
^{pr2}$itertools.izip()
成对收集每个文件中的行:我想不出使用其中一个而不是另一个的具体原因,但是如果文件的大小是任意的,那么就拒绝使用内置的}-前者返回一个列表,因此内存使用量取决于文件大小,而后者是一个生成器,因此可以根据需要创建值。在
zip()
函数而不是{您的问题是,一旦在
fileA
上迭代一次,您就需要再次更改指向文件开头的指针。 因此,您可以从这两个文件中创建两个列表,并根据需要对它们进行多次迭代。例如:相关问题 更多 >
编程相关推荐