Jak używać modułu difflib w Pythonie

Jak używać modułu difflib w Pythonie
W tym artykule obejmie przewodnik po użyciu modułu „Difflib” w Pythonie. Moduł Difflib można użyć do porównania dwóch obiektów Pythona z niektórych typów i podobieństw lub różnic między nimi. Wszystkie próbki kodu w tym artykule są testowane z Python 3.9.5 na Ubuntu 21.04.

O module difflib

Moduł Difflib, jak sama nazwa wskazuje, można użyć do znalezienia różnic lub „różnicy” między zawartością plików lub innymi obiektami Python Hashable Python. Można go również użyć do znalezienia stosunku, który pokazuje zakres podobieństw między dwoma obiektami. Wykorzystanie modułu Difflib i jego funkcji można najlepiej zrozumieć za pomocą przykładów. Niektóre z nich są wymienione poniżej.

O obiektach Hashable Python

W Pythonie typy obiektów, których wartość nie może się zmienić, lub większość niezmiennych typów obiektów nazywa się typami skrótów. Obiekty typu Hashable mają pewną stałą wartość przypisaną przez Pythona podczas deklaracji, a wartości te nie zmieniają się w ciągu ich życia. Wszystkie obiekty Hashable w Pythonie mają metodę „__hash__”. Spójrz na poniższą próbkę kodu:

liczba = 6
print (typ (numer))
Drukuj (numer.__haszysz__())
Word = „coś”
drukuj (typ (słowo))
Drukuj (Word.__haszysz__())
Dictionary = „A”: 1, „B”: 2
Drukuj (typ (słownik))
Drukuj (słownik.__haszysz__())

Po uruchomieniu powyższej próbki kodu należy uzyskać następujące dane wyjściowe:

Próbka kodu zawiera trzy typy Pythona: obiekt typu liczb całkowitych, obiekt typu ciągów i obiekt typu słownika. Wyjście pokazuje, że podczas wywoływania metody „__hash__” obiekt typu liczb całkowitych i obiekt typu ciągów pokazują określoną wartość, podczas gdy obiekt typu słownika rzuca błąd, ponieważ nie ma metody o nazwie „__hash__”. Stąd typ liczb całkowitych lub typ ciągów jest obiektem skrótem w Pythonie, podczas gdy typ słownika nie jest. Możesz dowiedzieć się więcej o obiektach Hashable.

Porównanie dwóch obiektów Pythona z Hashable

Możesz porównać dwa typy lub sekwencje skrótów za pomocą klasy „różni się” dostępną w module Difflib. Spójrz na poniższą próbkę kodu.

od difflib import różni się
line1 = "ABCD"
line2 = "CDEF"
D = różnica ()
różnica = lista (d.Porównaj (line1, line2))
Drukuj (różnica)

Pierwsza instrukcja importuje klasę różnicę od modułu Difflib. Następnie dwie zmienne typu ciągów są zdefiniowane za pomocą niektórych wartości. Nowa instancja klasy różnej jest następnie tworzona jako „D”. Za pomocą tej instancji wywoływana jest metoda „Porównaj”, aby znaleźć różnicę między ciągami „linii1” i „linii2”. Te ciągi są dostarczane jako argumenty do metody porównania. Po uruchomieniu powyższej próbki kodu należy uzyskać następujące dane wyjściowe:


Drogi lub znaki minus wskazują, że „linia2” nie ma tych znaków. Znaki bez żadnych znaków lub wiodącej białej listy są wspólne dla obu zmiennych. Znaki ze znakiem plus są dostępne tylko w ciągu „linii2”. Aby uzyskać lepszą czytelność, możesz użyć nowej postaci i metody „połączenia”, aby wyświetlić linię według wyjścia linii:

od difflib import różni się
line1 = "ABCD"
line2 = "CDEF"
D = różnica ()
różnica = lista (d.Porównaj (line1, line2))
różnica = '\ n'.dołącz (różnica)
Drukuj (różnica)

Po uruchomieniu powyższej próbki kodu należy uzyskać następujące dane wyjściowe:

Zamiast klasy różnej możesz również użyć klasy „HTMLDIFF” do wytworzenia kolorowych wyjściowych w formacie HTML.

z difflib import htmldiff
line1 = "ABCD"
line2 = "CDEF"
d = htmldiff ()
Różnica = d.Make_file (linia1, linia2)
Drukuj (różnica)

Próbka kodu jest taka sama jak powyżej, z tym wyjątkiem, że instancja różnej klasy została zastąpiona instancją klasy HTMLDIFF i zamiast metody porównywania, teraz wywołujesz metodę „Make_file”. Po uruchomieniu powyższego polecenia otrzymasz wyjście HTML w terminalu. Możesz wyeksportować wyjście do pliku za pomocą symbolu „>” w Bash lub możesz użyć poniższej próbki kodu, aby wyeksportować wyjście do „Diff.plik html ”od samego Pythona.

z difflib import htmldiff
line1 = "ABCD"
line2 = "CDEF"
d = htmldiff ()
Różnica = d.Make_file (linia1, linia2)
z otwartym („diff.html ”,„ w ”) jako f:
dla linii w różnicy.splitlines ():
druk (linia, file = f)

Oświadczenie „z otwartym” w trybie „W” tworzy nowe „Diff.plik html ”i zapisuje całą zawartość zmiennej„ różnicy ”w różnicy.plik HTML. Kiedy otworzysz różnicę.Plik HTML W przeglądarce powinieneś uzyskać układ podobny do tego:

Uzyskanie różnic między zawartością dwóch plików

Jeśli chcesz wytworzyć dane różnorodne z zawartości dwóch plików za pomocą różny.Porównaj () metodę, możesz użyć instrukcji „z otwartą” i metodą „odczytu” do odczytu zawartości plików. Poniższy przykład ilustruje to, gdzie zawartość „pliku1.txt ”i„ plik2.TXT ”są odczytywane za pomocą instrukcji„ z otwartymi ”. Instrukcje „z otwartymi” są używane do bezpiecznego odczytu danych z plików.

od difflib import różni się
z otwartym („File1.txt ") jako f:
file1_Lines = f.ReadLines ()
z otwartym („File2.txt ") jako f:
file2_Lines = f.ReadLines ()
D = różnica ()
różnica = lista (d.Porównaj (plik1_Lines, file2_Lines))
różnica = '\ n'.dołącz (różnica)
Drukuj (różnica)

Kod jest dość prosty i prawie taki sam jak przykład pokazany powyżej. Zakładając, że „plik 1.TXT ”zawiera znaki„ A ”,„ B ”,„ C ”i„ D ”na nowym wierszu i„ File2.TXT ”zawiera znaki„ C ”,„ D ”,„ E ”i„ F ”na nowym wierszu, powyższa próbka kodu wytworzy następujące dane wyjściowe:

Dane wyjściowe jest prawie takie samo jak poprzednio, znak „-” reprezentuje linie nie obecne w drugim pliku. Znak „+” pokazuje linie obecne tylko w drugim pliku. Linie bez żadnych znaków lub oba znaki są wspólne dla obu plików.

Współczynnik podobieństwa

Możesz użyć klasy „SekcenteMatcher” z modułu Difflib, aby znaleźć stosunek podobieństwa między dwoma obiektami Python. Zakres współczynnika podobieństwa leży między 0 a 1, gdzie posiadanie wartości 1 wskazuje na dokładne dopasowanie lub maksymalne podobieństwo. Wartość 0 oznacza całkowicie unikalne obiekty. Spójrz na poniższą próbkę kodu:

z dynamicznego sekwentematcher
line1 = "ABCD"
line2 = "CDEF"
SM = sekcenteMatcher (a = linia1, b = linia2)
Drukuj (SM.stosunek())

Utworzono instancję SecenCEmatcher z obiektami, które mają być porównywane jako argumenty „A” i „B”. Metoda „stosunku” jest następnie wezwana do instancji, aby uzyskać wskaźnik podobieństwa. Po uruchomieniu powyższej próbki kodu należy uzyskać następujące dane wyjściowe:

Wniosek

Moduł Difflib w Python może być używany na różne sposoby do porównywania danych z różnych obiektów skrótowych lub treści odczytanych z plików. Jego metoda współczynnika jest również przydatna, jeśli chcesz uzyskać procent podobieństwa między dwoma obiektami.