2017-05-08 445 views
0

我是Python的初學者,我想比較兩個文件。這裏是我的想法:逐行比較兩個文件,並將它們寫入第三個文件,並進行比較。然後我想讓輸出更加清晰,我首先比較每個文件的行號,但是我發現在for循環之後,結果之一的第三個文件是空白的。如果我爲這兩個文件刪除for循環,這沒關係。這裏是腳本:Python - for循環後的輸出爲空

import difflib 
import sys 
with open('file1','r') as file1: 
    with open ('file2','r') as file2: 
    line_num1=sum(1 for line in file1) 
    line_num2=sum(1 for line in file2) 
    diffInstance = difflib.Differ() 
    diffList = list(diffInstance.compare(file1.readlines(), file2.readlines())) 
    with open ('result', 'w') as result: 
    for i,line in enumerate(diffList): 
     result.write(line) 
    if line_num1 == line_num2: 
     if line.startswith('+'): 
     sys.stdout.write('Current-Line: {}, text: {}'.format(i-1,line)) 
     elif line.startswith('-'): 
     sys.stdout.write('Previous-Line: {}, text: {}'.format(i+1,line))      
    elif line_num1 > line_num2: 
     x = line_num1-line_num2 
    elif line_num1<line_num2: 
     y = line_num2-line_num1 
+2

建設有用的diff是一個實際上有一定數量的學術出版物的主題。您可以從http://dl.acm.org/citation.cfm?id=2554893或http://www.cs.man.ac.uk/~norm/papers/ssdbm08.pdf開始(儘管後面的調查工具如何在一些相當專業的數據集中工作)。如果你的目標僅僅是確定平等而不是識別變化,相反,「difflib」是非常重量級的(運行比必要的更多的CPU和內存密集型算法);我建議比較SAX風格的事件流以獲得快速的是/否。 –

+0

謝謝,但我想知道爲什麼腳本不能正常工作 – Emily

回答

0

Charles Duffy的評論是非常有用的。然而,你的輸出是空的,因爲這些線路的,因爲他們試圖讀取該文件的內容的兩倍:

line_num1=sum(1 for line in xmlfile1) 
line_num2=sum(1 for line in xmlfile2) 

diffList = list(diffInstance.compare(xmlfile1.readlines(), xmlfile2.readlines())) 

要計算line_num1您正在閱讀xmlfile1每一行,這意味着存儲在xmlfile1是文件對象留下來提及文件的結尾。然後,您嘗試使用xmlfile1.readlines()再次讀取它,但xmlfile1沒有更多行可讀,因爲它指向文件的末尾。

保持儘可能多的現有代碼儘可能的,要調用的方法是seek()我們可以指示回到該文件的開始與0:XML文件

line_num1=sum(1 for line in xmlfile1) 
line_num2=sum(1 for line in xmlfile2) 
xmlfile1.seek(0) 
xmlfile2.seek(0) 
diffList = list(diffInstance.compare(xmlfile1.readlines(), xmlfile2.readlines())) 
+0

謝謝西蒙,它解決了我的問題:) – Emily