Сравнение двух файлов .txt с использованием difflib в Python - PullRequest
20 голосов
/ 10 июня 2009

Я пытаюсь сравнить два текстовых файла и вывести первую строку в файле сравнения, которая не соответствует, но у меня возникли трудности, так как я очень плохо знаком с Python. Может кто-нибудь, пожалуйста, дайте мне пример использования этого модуля.

Когда я пытаюсь что-то вроде:

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

Я получаю сообщение об ошибке, говорящее, что объект типа 'file' не имеет len.

Ответы [ 5 ]

30 голосов
/ 10 июня 2009

Для начала вам нужно передать строки в difflib.SequenceMatcher, а не файлы:

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

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

Это все равно исправит твою ошибку. Чтобы получить первую несоответствующую строку, я направлю вас в удивительный мир документации difflib.

9 голосов
/ 15 февраля 2014

Вот быстрый пример сравнения содержимого двух файлов с использованием Python difflib ...

import difflib

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

diff = difflib.ndiff(open(file1).readlines(),open(file2).readlines())
print ''.join(diff),
5 голосов
/ 10 июня 2009

Вы уверены, что оба файла существуют?

Только что проверил, и я получил отличный результат.

Чтобы получить результаты, я использую что-то вроде:

import difflib

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

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

первый символ каждой строки указывает, отличаются ли они: Например: «+» означает, что была добавлена ​​следующая строка и т. д.

3 голосов
/ 10 июня 2009

Похоже, вам вообще не нужен 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!"
0 голосов
/ 21 мая 2019

Еще один более простой способ проверить, являются ли два текстовых файла одинаковыми построчно. Попробуйте.

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 есть предопределенный файл в filecmp, который вы можете использовать.

import filecmp

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

print(filecmp.cmp(fname1, fname2))

:)

...