Come usare il modulo Difflib in Python

Come usare il modulo Difflib in Python
Questo articolo coprirà una guida sull'uso del modulo "Difflib" in Python. Il modulo difflib può essere utilizzato per confrontare due oggetti Python di alcuni tipi e visualizzare somiglianze o differenze tra loro. Tutti i campioni di codice in questo articolo sono testati con Python 3.9.5 su Ubuntu 21.04.

Sul modulo difflib

Il modulo Difflib, come suggerisce il nome, può essere usato per trovare differenze o "diff" tra i contenuti di file o altri oggetti di Python hashable. Può anche essere usato per trovare un rapporto che mostri l'entità delle somiglianze tra due oggetti. L'uso del modulo Difflib e le sue funzioni possono essere meglio compresi attraverso esempi. Alcuni di essi sono elencati di seguito.

A proposito di oggetti di Python hashable

In Python, i tipi di oggetti il ​​cui valore non è improbabile cambierà o la maggior parte dei tipi di oggetti immutabili sono chiamati tipi hashable. Gli oggetti di tipo hashable hanno un certo valore fisso assegnato da Python durante la dichiarazione e questi valori non cambiano durante la loro vita. Tutti gli oggetti hashable in Python hanno un metodo "__hash__". Dai un'occhiata al campione del codice di seguito:

numero = 6
Stampa (tipo (numero))
Stampa (numero.__hash __ ())
word = "qualcosa"
stampa (tipo (parola))
Stampa (parola.__hash __ ())
dizionario = "a": 1, "b": 2
Stampa (tipo (Dizionario))
Stampa (Dizionario.__hash __ ())

Dopo aver eseguito il campione di codice sopra, è necessario ottenere il seguente output:

Il campione di codice include tre tipi di python: un oggetto tipo intero, un oggetto tipo stringa e un oggetto di tipo di dizionario. L'output mostra che quando si chiama il metodo "__hash__", l'oggetto tipo intero e l'oggetto tipo stringa mostrano un certo valore mentre l'oggetto del tipo di dizionario lancia un errore in quanto non ha un metodo chiamato "__hash__". Quindi un tipo intero o un tipo di stringa è un oggetto hashable in Python mentre un tipo di dizionario non lo è. Puoi saperne di più sugli oggetti hashable da qui.

Confronto di due oggetti Python hashable

È possibile confrontare due tipi o sequenze hashable utilizzando la classe "Difference" disponibile nel modulo DiFFlib. Dai un'occhiata al campione di codice qui sotto.

dall'importazione difflib differisce
line1 = "ABCD"
Line2 = "CDEF"
d = differ ()
Differenza = elenco (d.Confronta (line1, line2))
Stampa (differenza)

La prima istruzione importa la classe Difference dal modulo DIFFlib. Successivamente, le variabili di tipo a due stringa sono definite con alcuni valori. Una nuova istanza della classe diversa viene quindi creata come "D". Usando questa istanza, il metodo "Confronta" viene quindi chiamato per trovare la differenza tra stringhe "line1" e "line2". Queste stringhe sono fornite come argomenti al metodo di confronto. Dopo aver eseguito il campione di codice sopra, è necessario ottenere il seguente output:


I segni trattini o meno indicano che "line2" non ha questi personaggi. I caratteri senza alcun segno o spazio bianco principale sono comuni a entrambe le variabili. I caratteri con segno più sono disponibili solo nella stringa "line2". Per una migliore leggibilità, è possibile utilizzare il carattere newline e il metodo "join" per visualizzare l'uscita riga per linea:

dall'importazione difflib differisce
line1 = "ABCD"
Line2 = "CDEF"
d = differ ()
Differenza = elenco (d.Confronta (line1, line2))
Differenza = '\ n'.Iscriviti (differenza)
Stampa (differenza)

Dopo aver eseguito il campione di codice sopra, è necessario ottenere il seguente output:

Invece della classe Differe.

da Difflib Import htmldiff
line1 = "ABCD"
Line2 = "CDEF"
d = htmldiff ()
Differenza = d.make_file (line1, line2)
Stampa (differenza)

Il campione di codice è lo stesso di sopra, tranne per il fatto che l'istanza della classe Differe. Dopo aver eseguito il comando sopra, otterrai un output HTML nel terminale. È possibile esportare l'output in un file utilizzando il simbolo ">" in bash oppure è possibile utilizzare il campione di codice seguente per esportare l'output in un "diff.file html "dallo stesso Python.

da Difflib Import htmldiff
line1 = "ABCD"
Line2 = "CDEF"
d = htmldiff ()
Differenza = d.make_file (line1, line2)
con aperto ("Diff.html "," w ") come f:
per linea nella differenza.splitlines ():
Stampa (riga, file = f)

L'istruzione "con aperta" in modalità "W" crea un nuovo "Diff.file html "e salva l'intero contenuto della variabile" differenza "al diff.file html. Quando apri il diff.file html in un browser, dovresti ottenere un layout simile a questo:

Ottenere differenze tra i contenuti di due file

Se si desidera produrre dati diff dal contenuto di due file utilizzando la differenza.Metodo di confronto (), è possibile utilizzare l'istruzione "con aperta" e il metodo "readline" per leggere il contenuto dei file. L'esempio seguente illustra questo dove il contenuto di "File1.txt "e" file2.txt "vengono letti usando le istruzioni" con open ". Le dichiarazioni "con aperta" vengono utilizzate per leggere in sicurezza i dati dai file.

dall'importazione difflib differisce
con Open ("File1.txt ") come f:
file1_lines = f.readlines ()
con Open ("File2.txt ") come f:
file2_lines = f.readlines ()
d = differ ()
Differenza = elenco (d.confronta (file1_lines, file2_lines))
Differenza = '\ n'.Iscriviti (differenza)
Stampa (differenza)

Il codice è piuttosto semplice e quasi lo stesso dell'esempio mostrato sopra. Supponendo che "file1.txt "contiene caratteri" a "," b "," c "e" d "ciascuno su una nuova riga e" file2.txt "contiene caratteri" C "," D "," E "e" F "ciascuno su una nuova riga, il campione di codice sopra produrrà il seguente output:

L'output è quasi lo stesso di prima, "-" il segno rappresenta le righe non presenti nel secondo file. Il segno "+" mostra le righe presenti solo nel secondo file. Righe senza alcun segno o con entrambi i segni sono comuni ad entrambi i file.

Trovare un rapporto di somiglianza

È possibile utilizzare la classe "SequenceMatcher" dal modulo DIFFLIB per trovare il rapporto di somiglianza tra due oggetti Python. L'intervallo del rapporto di somiglianza si trova tra 0 e 1 in cui avere un valore di 1 indica corrispondenza esatta o massima somiglianza. Un valore di 0 indica oggetti assolutamente univoci. Dai un'occhiata al campione del codice di seguito:

da Difflib Import Sequencematcher
line1 = "ABCD"
Line2 = "CDEF"
SM = sequenceMatcher (a = line1, b = line2)
Stampa (SM.rapporto())

È stata creata un'istanza sequencematcher con oggetti da confrontare come argomenti "A" e "B". Il metodo "rapporto" viene quindi chiamato sull'istanza per ottenere il rapporto di somiglianza. Dopo aver eseguito il campione di codice sopra, è necessario ottenere il seguente output:

Conclusione

Il modulo DIFFLIB in Python può essere utilizzato in vari modi per confrontare i dati di diversi oggetti hashable o contenuti letti dai file. Il suo metodo di rapporto è anche utile se si desidera solo ottenere una percentuale di somiglianza tra due oggetti.