1

我有以下形式的 2 个文件:

file1:
work1
7 8 9 10 11
1 2 3 4  5
6 7 8 9  10

file2:
work2
2 3 4 5 5
2 4 7 8 9
work1
7 8 9 10 11
1 2 4 4  5
6 7 8 9  10
work3
1 7 8 9 10

现在我想与文件进行比较,并且无论标题(work1)是否相等..我想比较后续部分并打印发现差异的行。例如

 work1 (file1)
7 8 9 10 11
1 2 3 4  5
6 7 8 9  10

work1 (file2)
7 8 9 10 11
1 2 4 4  5
6 7 8 9  10

现在我想打印出现差异的行,即“1 2 4 4 5”

为此,我编写了以下代码:

with open("file1",) as r, open("file2") as w:
    for line in r:
        if "work1" in line:
            for line1 in w:
                if "work1" in line1:
                        print "work1"

但是,从这里开始,我对如何同时读取这两个文件感到困惑。有人可以帮我解决这个问题...因为在比较“work1”之后我没有得到我应该如何并行读取文件

4

2 回答 2

1

itertools您可能想在 Python中试用模块。它包含一个名为的函数izip,可以满足您的需要,以及一个名为islice. 您可以遍历第二个文件,直到找到您要查找的标题,然后您可以将标题切片。

这是一些代码。

from itertools import *    

w = open('file2')
for (i,line) in enumerate(w):
  if "work1" in line:
    iter2 = islice(open('file2'), i, None, 1) # Starts at the correct line

f = open('file1')
for (line1,line2) in izip(f,iter2):
  print line1, line2 # Place your comparisons of the two lines here.

您现在可以保证,在循环的第一次运行中,您将在两行上都获得“work1”。之后就可以比较了。由于f比 短w,迭代器将耗尽自身并在您到达末尾时停止f

希望我解释得很好。

编辑:添加了导入语句。

编辑:我们需要重新打开 file2。这是因为在 Python 中迭代可迭代对象会消耗可迭代对象。所以,我们需要传递一个全新的来islice让它工作!

于 2013-03-24T18:52:42.937 回答
0
with open('f1.csv') as f1, open('f2.csv') as f2 :
    i=0
    break_needed = False
    while True :
        r1, r2 = f1.readline(), f2.readline()
        if len(r1) == 0 :
            print "eof found for f1"
            break_needed = True
        if len(r2) == 0 :
            print "eof found for f2"
            break_needed = True
        if break_needed : 
            break
        i += 1
        if r1 != r2 :
            print " line %i"%i
            print "file 1 : " + r1
            print "file 2 : " + r2
于 2013-03-24T18:40:51.593 回答