比较Python中的2个文件

2024-09-24 04:29:20 发布

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

我试图在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循环”似乎被忽略了。在

有人能帮我吗?在


Tags: 文件inforasopensplitprintuserid
3条回答

您正在比较FileA中的所有行与FileC中的每一行。这意味着,对于文件C的每一行,您将读取整个文件A,并且(如果您确实将指针移动到文件A的开头),您将反复读取它。在

当它们都有线条时,更容易同时阅读它们 如果他们是一样的,做点什么,从两者中读一读

如果它们不同,从最小值读取(行A<;行C,仅从文件A读取;行C<;行A,仅从C行读取)

你不知道每行有两个循环,每行循环一行

嵌套循环的问题(从当前问题的角度来看)正是因为外部循环的每次迭代都会运行到内部循环完成。因此,相反,通过从fileA迭代器显式调用下一项来设置lineA

with open(locationA + filenameC,'r') as fileC, open(locationA + filenameA,'r') as fileA:
     for lineC in fileC:
         fieldC = lineC.split('#')
         lineA = next(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'

一旦fileC耗尽,此逻辑将忽略fileA中的任何额外行,并且如果fileC包含的行数超过FileA则如果不进行特殊检查,则事物也可能变得丑陋。在

另一种方法可能使用itertools.izip()成对收集每个文件中的行:

^{pr2}$

我想不出使用其中一个而不是另一个的具体原因,但是如果文件的大小是任意的,那么就拒绝使用内置的zip()函数而不是{}-前者返回一个列表,因此内存使用量取决于文件大小,而后者是一个生成器,因此可以根据需要创建值。在

您的问题是,一旦在fileA上迭代一次,您就需要再次更改指向文件开头的指针。 因此,您可以从这两个文件中创建两个列表,并根据需要对它们进行多次迭代。例如:

fileC_list = fileC.readlines()
fileA_list = fileA.readlines()
for lineC in fileC_list:
  # do something
  for lineA in fileA_list:
    # do somethins

相关问题 更多 >