Cómo usar el módulo DIFFLIB en Python

Cómo usar el módulo DIFFLIB en Python
Este artículo cubrirá una guía sobre el uso del módulo "DIFFLIB" en Python. El módulo DIFFLIB se puede utilizar para comparar dos objetos de Python de ciertos tipos y ver similitudes o diferencias entre ellos. Todas las muestras de código en este artículo se prueban con Python 3.9.5 en Ubuntu 21.04.

Acerca del módulo DIFFLIB

El módulo DIFFLIB, como su nombre indica, puede usarse para encontrar diferencias o "difff" entre el contenido de archivos u otros objetos de Python Hashable. También se puede usar para encontrar una relación que muestra el alcance de las similitudes entre dos objetos. El uso del módulo DIFFLIB y sus funciones se pueden entender mejor a través de ejemplos. Algunos de ellos se enumeran a continuación.

Sobre objetos de Python Hashable

En Python, los tipos de objetos cuyo valor no es probable que cambien o la mayoría de los tipos de objetos inmutables se denominan tipos de Hashable. Los objetos de tipo hashable tienen un cierto valor fijo asignado por Python durante la declaración y estos valores no cambian durante su vida. Todos los objetos hashables en Python tienen un método "__hash__". Eche un vistazo a la muestra de código a continuación:

número = 6
Imprimir (tipo (número))
imprimir (número.__picadillo__())
word = "algo"
Imprimir (tipo (palabra))
imprimir (palabra.__picadillo__())
diccionario = "A": 1, "B": 2
Imprimir (tipo (diccionario))
impresión (diccionario.__picadillo__())

Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

La muestra de código incluye tres tipos de Python: un objeto de tipo entero, un objeto de tipo de cadena y un objeto de tipo de diccionario. La salida muestra que al llamar al método "__hash__", el objeto de tipo entero y el objeto de tipo de cadena muestran un cierto valor, mientras que el objeto de tipo de diccionario arroja un error, ya que no tiene un método llamado "__hash__". Por lo tanto, un tipo entero o un tipo de cadena es un objeto hashable en Python, mientras que un tipo de diccionario no es. Puede obtener más información sobre objetos de Hashable desde aquí.

Comparación de dos objetos de Python Hashable

Puede comparar dos tipos o secuencias hashables utilizando la clase "Differ" disponible en el módulo DIFFLIB. Eche un vistazo a la muestra de código a continuación.

de la importación difflib difiere
línea1 = "ABCD"
línea2 = "CDEF"
d = diferir ()
diferencia = lista (D.Comparar (Line1, Line2))
Imprimir (diferencia)

La primera declaración importa la clase Differ que el módulo DIFFLIB. A continuación, dos variables de tipo de cadena se definen con algunos valores. Luego se crea una nueva instancia de la clase de diferencias como "D". Usando esta instancia, se llama al método "Comparar" para encontrar la diferencia entre las cadenas "Line1" y "Line2". Estas cadenas se suministran como argumentos al método de comparación. Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:


Los guiones o los signos menos indican que "Line2" no tiene estos personajes. Los caracteres sin signos o espacios en blanco líder son comunes a ambas variables. Los caracteres con signo más están disponibles en la cadena "Line2" solamente. Para una mejor legibilidad, puede usar el carácter NewLine y el método "unirse" para ver la salida de línea por línea:

de la importación difflib difiere
línea1 = "ABCD"
línea2 = "CDEF"
d = diferir ()
diferencia = lista (D.Comparar (Line1, Line2))
diferencia = '\ n'.unirse (diferencia)
Imprimir (diferencia)

Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

En lugar de la clase de diferencias, también puede usar la clase "HTMLDIFF" para producir salida de color en formato HTML.

de difflib import htmldiff
línea1 = "ABCD"
línea2 = "CDEF"
d = htmldiff ()
diferencia = D.make_file (línea1, línea2)
Imprimir (diferencia)

La muestra de código es la misma que se indicó, excepto que la instancia de clase de diferencia ha sido reemplazada por una instancia de la clase HTMLDIFF y en lugar del método Compare, ahora llama al método "Make_File". Después de ejecutar el comando anterior, obtendrá algo de salida HTML en el terminal. Puede exportar la salida a un archivo utilizando el símbolo ">" en Bash o puede usar la muestra de código a continuación para exportar la salida a un "Diff.archivo html "de python en sí.

de difflib import htmldiff
línea1 = "ABCD"
línea2 = "CDEF"
d = htmldiff ()
diferencia = D.make_file (línea1, línea2)
con abierto ("diff.html "," w ") como f:
Para la línea en la diferencia.SplitLines ():
imprimir (línea, archivo = f)

La declaración "con abierta" en el modo "W" crea un nuevo "Diff.archivo html "y guarda el contenido completo de la variable" diferencia "a la diferencia.archivo html. Cuando abres la diferencia.Archivo HTML En un navegador, debe obtener un diseño similar a este:

Obtener diferencias entre el contenido de dos archivos

Si desea producir datos de diferencia del contenido de dos archivos utilizando la diferencia.Método Compare (), puede usar el método "Con Open" y el método "Readline" para leer el contenido de los archivos. El ejemplo a continuación ilustra esto donde el contenido de "archivo1.txt "y" file2.TXT "se leen utilizando declaraciones" con abierto ". Las declaraciones "con abiertos" se utilizan para leer datos de forma segura de los archivos.

de la importación difflib difiere
Con Open ("Archivo1.txt ") como f:
file1_lines = F.ReadLines ()
con Open ("File2.txt ") como f:
file2_lines = F.ReadLines ()
d = diferir ()
diferencia = lista (D.Compare (file1_lines, file2_lines))
diferencia = '\ n'.unirse (diferencia)
Imprimir (diferencia)

El código es bastante sencillo y casi el mismo que el ejemplo que se muestra arriba. Suponiendo que "archivo1.TXT "contiene" A "," B "," C "y" D ", cada uno en una nueva línea y" File2.Txt "contiene caracteres" C "," D "," E "y" F "cada uno en una nueva línea, la muestra de código anterior producirá la siguiente salida:

La salida es casi la misma que antes, "-" El signo representa líneas que no están presentes en el segundo archivo. El signo "+" muestra líneas solo presentes en el segundo archivo. Las líneas sin signos o tener ambos signos son comunes a ambos archivos.

Encontrar relación de similitud

Puede usar la clase "Sequencematcher" del módulo DIFFLIB para encontrar la relación de similitud entre dos objetos de Python. El rango de la relación de similitud se encuentra entre 0 y 1 donde tener un valor de 1 indica una coincidencia exacta o máxima similitud. Un valor de 0 indica objetos totalmente únicos. Eche un vistazo a la muestra de código a continuación:

de DIFFLIB IMPORT SECENCEMACHER
línea1 = "ABCD"
línea2 = "CDEF"
SM = SECHENCEMATCHER (A = LINE1, B = LINE2)
Imprimir (SM.relación())

Se ha creado una instancia de secuencia con objetos que se comparan como argumentos "A" y "B". El método de "relación" se llama a la instancia que obtenga la relación de similitud. Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

Conclusión

El módulo DIFFLIB en Python se puede utilizar en una variedad de formas para comparar datos de diferentes objetos hashables o contenido leído de archivos. Su método de relación también es útil si solo desea obtener un porcentaje de similitud entre dos objetos.