Cara Menggunakan Modul Difflib dengan Python

Cara Menggunakan Modul Difflib dengan Python

Artikel ini akan membahas panduan menggunakan modul “difflib” dengan Python. Modul difflib dapat digunakan untuk membandingkan dua objek Python dari tipe tertentu dan melihat persamaan atau perbedaan di antara keduanya. Semua contoh kode dalam artikel ini diuji dengan Python 3.9.5 di Ubuntu 21.04.

Tentang Modul Difflib

Modul difflib, seperti namanya, dapat digunakan untuk menemukan perbedaan atau “diff” antara konten file atau objek Python hashable lainnya. Ini juga dapat digunakan untuk menemukan rasio yang menunjukkan tingkat kesamaan antara dua objek. Penggunaan modul difflib dan fungsinya dapat dipahami dengan baik melalui contoh. beberapa dari mereka terdaftar di bawah ini.

Tentang Objek Python yang Dapat Di-hash

Dalam Python, tipe objek yang nilainya tidak mungkin berubah atau sebagian besar tipe objek yang tidak dapat diubah disebut tipe hashable. Objek tipe hashable memiliki nilai tetap tertentu yang ditetapkan oleh Python selama deklarasi dan nilai-nilai ini tidak berubah selama masa pakainya. Semua objek hashable di Python memiliki metode “__hash__”. Lihat contoh kode di bawah ini:

number = 6
print (type(number))
print (number.__hash__())

word = "something"
print (type(word))
print (word.__hash__())

dictionary = {"a" : 1, "b": 2}
print (type(dictionary))
print (dictionary.__hash__())

Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

6

2168059999105608551

Traceback (most recent call last):
  File "/main.py", line 13, in
    print (dictionary.__hash__())
TypeError: 'NoneType' object is not callable

Contoh kode mencakup tiga tipe Python: objek tipe integer, objek tipe string, dan objek tipe kamus. Keluaran menunjukkan bahwa ketika memanggil metode “__hash__”, objek tipe integer dan objek tipe string menunjukkan nilai tertentu, sedangkan objek tipe kamus melontarkan error karena tidak memiliki metode yang disebut “__hash__”. Oleh karena itu tipe integer atau tipe string adalah objek hashable dalam Python sedangkan tipe kamus tidak. Anda dapat mempelajari lebih lanjut tentang objek hashable dari sini.

Membandingkan Dua Objek Python yang Dapat Di-hash

Anda dapat membandingkan dua tipe atau urutan hashable menggunakan kelas “Differ” yang tersedia di modul difflib. Lihat contoh kode di bawah ini.

from difflib import Differ

line1 = "abcd"
line2 = "cdef"
d = Differ()
difference = list(d.compare(line1, line2))
print (difference)

Pernyataan pertama mengimpor kelas Differ dari modul difflib. Selanjutnya, dua variabel tipe string didefinisikan dengan beberapa nilai. Sebuah instance baru dari kelas Differ kemudian dibuat sebagai “d”. Dengan menggunakan instance ini, metode “bandingkan” kemudian dipanggil untuk menemukan perbedaan antara string “baris1” dan “baris2”. String ini disediakan sebagai argumen untuk metode perbandingan. Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

['- a', '- b', '  c', '  d', '+ e', '+ f']

Tanda hubung atau tanda minus menunjukkan bahwa “baris2” tidak memiliki karakter ini. Karakter tanpa tanda atau spasi putih di depan umum untuk kedua variabel. Karakter dengan tanda plus hanya tersedia di string “line2”. Untuk keterbacaan yang lebih baik, Anda dapat menggunakan karakter baris baru dan metode “bergabung” untuk melihat output baris demi baris:

from difflib import Differ

line1 = "abcd"
line2 = "cdef"
d = Differ()
difference = list(d.compare(line1, line2))
difference = 'n'.join(difference)
print (difference)

Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

- a
- b
  c
  d
+ e
+ f

Alih-alih kelas Differ, Anda juga dapat menggunakan kelas “HtmlDiff” untuk menghasilkan output berwarna dalam format HTML.

from difflib import HtmlDiff

line1 = "abcd"
line2 = "cdef"
d = HtmlDiff()
difference = d.make_file(line1, line2)
print (difference)

Contoh kodenya sama seperti di atas, kecuali bahwa instance kelas Differ telah digantikan oleh turunan kelas HtmlDiff dan alih-alih metode perbandingan, Anda sekarang memanggil metode “make_file”. Setelah menjalankan perintah di atas, Anda akan mendapatkan beberapa output HTML di terminal. Anda dapat mengekspor output ke file menggunakan simbol “>” di bash atau Anda dapat menggunakan contoh kode di bawah ini untuk mengekspor output ke file “diff.html” dari Python itu sendiri.

from difflib import HtmlDiff

line1 = "abcd"
line2 = "cdef"
d = HtmlDiff()
difference = d.make_file(line1, line2)
with open("diff.html", "w") as f:
    for line in difference.splitlines():
        print (line, file=f)

Pernyataan “with open” dalam cara “w” membuat file “diff.html” baru dan menyimpan seluruh isi variabel “difference” ke fi
le diff.html. Saat Anda membuka file diff.html di browser, Anda akan mendapatkan tata letak yang mirip dengan ini:

Mendapatkan Perbedaan Antara Isi Dua File

Jika Anda ingin menghasilkan data yang berbeda dari isi dua file menggunakan metode Differ.compare(), Anda dapat menggunakan pernyataan “dengan terbuka” dan metode “readline” untuk membaca isi file. Contoh di bawah mengilustrasikan hal ini di mana konten “file1.txt” dan “file2.txt” dibaca menggunakan pernyataan “dengan terbuka”. Pernyataan “dengan terbuka” digunakan untuk membaca data dari file dengan aman.

from difflib import Differ

with open ("file1.txt") as f:
    file1_lines = f.readlines()
with open ("file2.txt") as f:
    file2_lines = f.readlines()
d = Differ()
difference = list(d.compare(file1_lines, file2_lines))
difference = 'n'.join(difference)
print (difference)

Kodenya cukup mudah dan hampir sama dengan contoh yang ditunjukkan di atas. Dengan asumsi bahwa “file1.txt” berisi karakter “a”, “b”, “c”, dan “d” masing-masing pada baris baru dan “file2.txt” berisi “c”, “d”, “e”, dan karakter “f” masing-masing pada baris baru, contoh kode di atas akan menghasilkan output sebagai berikut:

- a

- b

  c

- d
+ d

+ e

+ f

Outputnya hampir sama dengan sebelumnya, tanda “-” mewakili garis yang tidak ada di file kedua. Tanda “+” menunjukkan baris yang hanya ada di file kedua. Garis tanpa tanda atau memiliki kedua tanda adalah umum untuk kedua file.

Menemukan Rasio Kesamaan

Anda dapat menggunakan kelas “sequenceMatcher” dari modul difflib untuk menemukan rasio kesamaan antara dua objek Python. Rentang rasio kesamaan terletak antara 0 dan 1 dimana memiliki nilai 1 menunjukkan kecocokan yang tepat atau kesamaan maksimum. Nilai 0 menunjukkan objek yang benar-benar unik. Lihat contoh kode di bawah ini:

from difflib import SequenceMatcher
line1 = "abcd"
line2 = "cdef"
sm = SequenceMatcher(a=line1, b=line2)
print (sm.ratio())

Instance SequenceMatcher telah dibuat dengan objek untuk dibandingkan yang diberikan sebagai argumen “a” dan “b”. Metode “rasio” kemudian dipanggil ke instance untuk mendapatkan rasio kesamaan. Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

0.5

Kesimpulan

Modul difflib dalam Python dapat digunakan dalam berbagai cara untuk membandingkan data dari objek hashable yang berbeda atau konten yang dibaca dari file. Metode rasionya juga berguna jika Anda hanya ingin mendapatkan persentase kesamaan antara dua objek.

Related Posts