web-dev-qa-db-ja.com

Pythonでdifflibを使用して2つの.textファイルを比較する

2つのテキストファイルを比較して、一致しない最初の文字列を比較ファイルに出力しようとしていますが、Pythonを初めて使用するので問題があります。誰でも私にこのモジュールの使用方法の例を教えてください。

私が何かをしようとすると:

result = difflib.SequenceMatcher(None, testFile, comparisonFile)

タイプ「ファイル」のオブジェクトにlenがないというエラーが表示されます。

21
101010110101

まず、ファイルではなく文字列をdifflib.SequenceMatcherに渡す必要があります。

# Like so
difflib.SequenceMatcher(None, str1, str2)

# Or just read the files in
difflib.SequenceMatcher(None, file1.read(), file2.read())

それはとにかくあなたのエラーを修正します。一致しない最初の文字列を取得するために、 difflibのドキュメントのすばらしい世界を紹介します。

33
Triptych

Python difflib ...を使用して2つのファイルの内容を比較する簡単な例を示します。

import difflib

file1 = "myFile1.txt"
file2 = "myFile2.txt"

diff = difflib.ndiff(open(file1).readlines(),open(file2).readlines())
print ''.join(diff),
9
Vyke

両方のファイルが存在することを確認しますか?

ちょうどそれをテストし、私は完璧な結果を得ます。

結果を取得するには、次のようなものを使用します。

import difflib

diff=difflib.ndiff(open(testFile).readlines(), open(comparisonFile).readlines())

try:
    while 1:
        print diff.next(),
except:
    pass

各行の最初の文字は、それらが異なるかどうかを示します。例:「+」は、次の行が追加されたことを意味します。

5
RSabet

Difflibはまったく必要ないようです。行ごとに比較する場合は、次のようなことを試してください。

test_lines = open("test.txt").readlines()
correct_lines = open("correct.txt").readlines()

for test, correct in Zip(test_lines, correct_lines):
    if test != correct:
        print "Oh no! Expected %r; got %r." % (correct, test)
        break
else:
    len_diff = len(test_lines) - len(correct_lines)
    if len_diff > 0:
        print "Test file had too much data."
    Elif len_diff < 0:
        print "Test file had too little data."
    else:
        print "Everything was correct!"
3

2つのテキストファイルが行ごとに同じであるかどうかを確認する別の簡単な方法。やってみて。

fname1 = 'text1.txt'
fname2 = 'text2.txt'

f1 = open(fname1)
f2 = open(fname2)

lines1 = f1.readlines()
lines2 = f2.readlines()
i = 0
f1.seek(0)
f2.seek(0)
for line1 in f1:
    if lines1[i] != lines2[i]:
        print(lines1[i])
        exit(0)
    i = i+1

print("both are equal")

f1.close()
f2.close()

それ以外の場合は、python in filecmpに使用可能な事前定義ファイルがあります。

import filecmp

fname1 = 'text1.txt'
fname2 = 'text2.txt'

print(filecmp.cmp(fname1, fname2))

:)

0
Rishab Rahiman