2013-03-24 70 views
1

行我有2个文件的格式如下:比较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)是equal..I要比较的后续部分并打印找到差异的行。例如。

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”的应该怎么读取文件平行

+0

读入内存(每个r.read()和w.read()到一个变量),然后做比较。并行不是正确的词。 – CppLearner 2013-03-24 18:17:22

+0

CppLearner该方法是可行的,只有当我的文件不大的大文件的方法是不可行的 – user1778824 2013-03-24 18:19:32

+0

好点。那么,如果你确定像'work1'这样的头文件不会在同一个文件中重复出现,那么你可以打开这个文件并且读取出现子字符串的位置,然后结束并且出现下一个头文件。将它们记录在两个文件中然后阅读。我不知道性能如何与这两个文件读入同一个迭代器相比较http://stackoverflow.com/questions/3322419/iterate-across-lines-in-two-files-simultaneously-in-python。 – CppLearner 2013-03-24 18:33:36

回答

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 
1

你可能会想尝试在Python itertools模块。 它包含一个名为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,所以它的工作原理!

+1

'islice(w,i,None,1)'从文件当前位置开始跳过'i'行。 – 2013-03-24 19:02:42

+0

@AVP感谢您的回复......请您解释“islice”的功能。其实它给我错误..名字'islice'没有定义。另外我已经导入itertools..still我不知道为什么它会抛出错误 – user1778824 2013-03-24 19:07:16

+0

你在做itertools.islice或者你在做islice吗? 第二个只有在你的import语句是“from itertools import *”时才能工作,而第一个会在你执行“import itertools”时工作。 – AVP 2013-03-24 19:12:02