web-dev-qa-db-fra.com

Comparaison de deux fichiers .text en utilisant difflib dans Python

J'essaie de comparer deux fichiers texte et de sortir la première chaîne du fichier de comparaison qui ne correspond pas, mais j'ai des difficultés car je suis très nouveau sur python. Quelqu'un peut-il me donner un exemple d'utilisation de ce module?.

Quand j'essaye quelque chose comme:

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

Je reçois une erreur disant que l'objet de type "fichier" n'a pas de len.

21
101010110101

Pour commencer, vous devez passer des chaînes à difflib.SequenceMatcher, pas des fichiers:

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

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

De toute façon, cela corrigera votre erreur. Pour obtenir la première chaîne non correspondante, je vais vous diriger vers le monde merveilleux de documentation difflib.

33
Triptych

Voici un exemple rapide de comparaison du contenu de deux fichiers en utilisant Python difflib ...

import difflib

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

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

Êtes-vous sûr que les deux fichiers existent?

Je viens de le tester et j'obtiens un résultat parfait.

Pour obtenir les résultats, j'utilise quelque chose comme:

import difflib

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

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

le premier caractère de chaque ligne indique si elles sont différentes: par exemple: "+" signifie que la ligne suivante a été ajoutée, etc.

5
RSabet

Il semble que vous n'ayez pas besoin du tout de difflib. Si vous comparez ligne par ligne, essayez quelque chose comme ceci:

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
Filip Salomonsson

Une autre méthode plus simple pour vérifier si deux fichiers texte sont identiques ligne par ligne. Essaye le.

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()

sinon, il y a un fichier prédéfini dans python dans filecmp que vous pouvez utiliser.

import filecmp

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

print(filecmp.cmp(fname1, fname2))

:)

0
Rishab Rahiman