2017-05-08 22 views
0

私はPythonの初心者です。私は2つのファイルを比較したいと思います。私の考えは次のとおりです。2つのファイルを1行ずつ比較し、3番目のファイルに比較の差を付けて書き込みます。次に、出力をより明確にして、最初に各ファイルの行番号を比較したいのですが、私が見つけたのはforループの後に3番目のファイルが空白になったことです。 2つのファイルの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:

可能な限り既存のコードの多くを維持、呼び出すメソッドは、私たちが0で、ファイルの先頭に戻って指示することができますseek()です実際にある程度の学術出版物がある主題。 http://dl.acm.org/citation.cfm?id=2554893、またはhttp://www.cs.man.ac.uk/~norm/papers/ssdbm08.pdfから始めることができます(後者の調査かなり特殊なデータセットのコンテキストでのみツールがどのように機能するか)対照的に、変更点を特定するのではなく、単に同等性を判断するだけの目的ならば、difflibは非常に重く(必要以上にCPUとメモリを大量に消費するアルゴリズムを実行します)。私は速いyes/noを得るためにSAXスタイルのイベントストリームを比較することをお勧めします。 –

+0

ありがとう、しかし、私はスクリプトがうまく動作しない理由が不思議です – Emily

答えて

0

チャールズダフィーのコメントは非常に便利です。彼らは二回、ファイルの内容を読み取ろうとして、しかし、あなたの出力は、なぜならこれらの行の空白です:

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

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

xmlfile1に保存されたファイルオブジェクトがあることを意味している、あなたはxmlfile1内のすべての行を読んでいるline_num1計算するにはファイルの最後を参照してください。次に、xmlfile1.readlines()でもう一度試してみますが、xmlfile1はファイルの最後を指しているので、読むべき行はもうありません。 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

関連する問題