Como usar o módulo Difflib em Python

Como usar o módulo Difflib em Python
Este artigo abordará um guia sobre o uso do módulo "difflib" no Python. O módulo difflib pode ser usado para comparar dois objetos python de certos tipos e ver semelhanças ou diferenças entre eles. Todas as amostras de código deste artigo são testadas com Python 3.9.5 no Ubuntu 21.04.

Sobre o módulo diffflib

O módulo Difflib, como o nome sugere, pode ser usado para encontrar diferenças ou "diff" entre o conteúdo de arquivos ou outros objetos Hashable Python. Também pode ser usado para encontrar uma proporção que mostre a extensão das semelhanças entre dois objetos. O uso do módulo Difflib e suas funções podem ser melhor compreendidos através de exemplos. Alguns deles estão listados abaixo.

Sobre objetos de python hashable

No Python, os tipos de objetos cujo valor provavelmente não mudarão ou a maioria dos tipos de objetos imutáveis ​​são chamados de tipos de hashable. Os objetos do tipo hashable têm um certo valor fixo atribuído pelo Python durante a declaração e esses valores não mudam durante a vida. Todos os objetos hashable em python têm um método "__hash__". Dê uma olhada no exemplo de código abaixo:

número = 6
Imprimir (tipo (número))
Imprimir (número.__cerquilha__())
word = "algo"
Imprimir (tipo (palavra))
Imprimir (palavra.__cerquilha__())
dicionário = "A": 1, "B": 2
Imprimir (Tipo (Dicionário))
Impressão (dicionário.__cerquilha__())

Depois de executar a amostra de código acima, você deve obter a seguinte saída:

A amostra de código inclui três tipos de python: um objeto de tipo inteiro, um objeto de tipo de string e um objeto de tipo de dicionário. A saída mostra que, ao chamar o método "__hash__", o objeto do tipo inteiro e o objeto Tipo de string mostram um determinado valor enquanto o objeto do tipo de dicionário lança um erro, pois não possui um método chamado "__hash__". Portanto, um tipo inteiro ou um tipo de string é um objeto hashable em python, enquanto um tipo de dicionário não é. Você pode aprender mais sobre objetos hashable a partir daqui.

Comparando dois objetos hashable python

Você pode comparar dois tipos ou seqüências de hashable usando a classe "diferente" disponível no módulo Difflib. Dê uma olhada no exemplo de código abaixo.

da importação de difflib diferem
linha1 = "ABCD"
linha2 = "CDEF"
d = diferem ()
diferença = lista (D.Compare (Linha1, Linha2))
Imprimir (diferença)

A primeira declaração importa a classe diferente do módulo Difflib. Em seguida, duas variáveis ​​do tipo string são definidas com alguns valores. Uma nova instância da classe diferente é criada como "D". Usando esta instância, o método "Compare" é então chamado para encontrar a diferença entre strings "line1" e "line2". Essas cordas são fornecidas como argumentos para o método de comparação. Depois de executar a amostra de código acima, você deve obter a seguinte saída:


Os traços ou sinais negativos indicam que "line2" não tem esses personagens. Personagens sem sinais ou espaço em branco são comuns a ambas as variáveis. Personagens com placas estão disponíveis apenas na string "Line2". Para melhor legibilidade, você pode usar o personagem Newline e o método "ingressar" para visualizar a saída de linha por linha:

da importação de difflib diferem
linha1 = "ABCD"
linha2 = "CDEF"
d = diferem ()
diferença = lista (D.Compare (Linha1, Linha2))
diferença = '\ n'.Junte -se (diferença)
Imprimir (diferença)

Depois de executar a amostra de código acima, você deve obter a seguinte saída:

Em vez da classe diferente, você também pode usar a classe "htmldiff" para produzir saída colorida em formato html.

de difflib importar htmldiff
linha1 = "ABCD"
linha2 = "CDEF"
d = htmldiff ()
diferença = d.make_file (linha1, linha2)
Imprimir (diferença)

O exemplo de código é o mesmo que acima, exceto que a instância de classe diferente foi substituída por uma instância da classe HTMLDIFF e, em vez do método de comparação, agora você chama o método "make_file". Depois de executar o comando acima, você obterá alguma saída HTML no terminal. Você pode exportar a saída para um arquivo usando o símbolo ">" em Bash ou pode usar o exemplo de código abaixo para exportar a saída para um "Dift.Arquivo HTML ”do próprio Python.

de difflib importar htmldiff
linha1 = "ABCD"
linha2 = "CDEF"
d = htmldiff ()
diferença = d.make_file (linha1, linha2)
com open ("diff.html "," w ") como f:
para linha de diferença.Splitlines ():
Imprimir (linha, arquivo = f)

A declaração "com aberto" no modo "W" cria um novo "Diff.arquivo html ”e salva todo o conteúdo da variável“ diferença ”para o diferencial.arquivo html. Quando você abre o diferencial.Arquivo HTML Em um navegador, você deve obter um layout semelhante a este:

Obtendo diferenças entre o conteúdo de dois arquivos

Se você deseja produzir dados diff a partir do conteúdo de dois arquivos usando o diferente.Método Compare (), você pode usar a instrução “com aberto” e o método “readline” para ler o conteúdo dos arquivos. O exemplo abaixo ilustra isso onde o conteúdo de “file1.txt "e" file2.txt ”são lidos usando declarações“ com aberto ”. As declarações "com aberto" são usadas para ler com segurança dados de arquivos.

da importação de difflib diferem
com open ("file1.txt ") como f:
file1_lines = f.ReadLines ()
com open ("file2.txt ") como f:
file2_lines = f.ReadLines ()
d = diferem ()
diferença = lista (D.Compare (File1_Lines, File2_Lines)))
diferença = '\ n'.Junte -se (diferença)
Imprimir (diferença)

O código é bem direto e quase o mesmo que o exemplo mostrado acima. Supondo que “file1.TXT "contém caracteres" A "," B "," C "e" D "cada um em uma nova linha e" File2.TXT "contém caracteres" C "," D "," E "e" F "cada um em uma nova linha, a amostra de código acima produzirá a seguinte saída:

A saída é quase a mesma de antes: "-", o sinal representa linhas não presentes no segundo arquivo. O sinal "+" mostra linhas presentes apenas no segundo arquivo. Linhas sem sinais ou os dois sinais são comuns a ambos os arquivos.

Encontrando a taxa de similaridade

Você pode usar a classe "SequenceMatcher" do módulo Difflib para encontrar a razão de similaridade entre dois objetos Python. O intervalo da taxa de similaridade fica entre 0 e 1, onde ter um valor de 1 indica correspondência exata ou similaridade máxima. Um valor 0 indica objetos totalmente únicos. Dê uma olhada no exemplo de código abaixo:

do diffflib Import sequenceMatcher
linha1 = "ABCD"
linha2 = "CDEF"
sm = sequenceMatcher (a = linha1, b = line2)
Imprima (Sm.razão())

Uma instância de sequencematcher foi criada com objetos a serem comparados como argumentos "A" e "B". O método "proporção" é então chamado na instância para obter a taxa de similaridade. Depois de executar a amostra de código acima, você deve obter a seguinte saída:

Conclusão

O módulo Difflib em Python pode ser usado de várias maneiras para comparar dados de diferentes objetos ou conteúdo de hashable ou lido de arquivos. Seu método de razão também é útil se você deseja apenas obter uma porcentagem de similaridade entre dois objetos.