Materi
Laporan cabang datang sebagai berkas terpisah dengan pola nama yang sama: cabang_bandung.xlsx, cabang_medan.xlsx, dan seterusnya. Path(".").glob("cabang_*.xlsx") dari modul pathlib menemukan semua berkas yang namanya cocok dengan pola, sehingga skrip tidak perlu diubah saat cabang baru bergabung. Tanda * mewakili teks apa pun.
Urutan hasil pencarian berkas tidak dijamin; dokumentasi pathlib menyebut isi folder dihasilkan dalam urutan acak. Bungkus dengan sorted() agar urutan gabungan sama setiap kali skrip dijalankan. Atribut p.name memberi nama berkas, dan p.stem memberi nama tanpa ekstensi, misalnya "cabang_medan"; method str.removeprefix("cabang_") menyisakan "medan".
from pathlib import Path
from openpyxl import load_workbook
semua = []
for berkas in sorted(Path(".").glob("absen_*.xlsx")):
divisi = berkas.stem.removeprefix("absen_")
ws = load_workbook(berkas).active
for nama, hadir in ws.iter_rows(min_row=2, values_only=True):
semua.append([divisi, nama, hadir])Kolom asal (cabang atau divisi) ditambahkan di depan setiap baris, karena setelah digabung tidak ada lagi yang menandai baris itu datang dari mana. min_row=2 menjaga judul kolom setiap berkas tidak ikut masuk di tengah gabungan.
Kesalahan yang sering terjadi
Menyimpan hasil gabungan dengan nama yang cocok dengan pola, misalnya cabang_gabungan.xlsx, membuat skrip membaca hasilnya sendiri saat dijalankan berikutnya, dan semua angka menjadi dua kali lipat tanpa pesan error. Beri berkas hasil nama di luar pola. Bila glob tidak menemukan apa pun, perulangan tidak berjalan sama sekali dan hasilnya kosong — periksa folder dan polanya, termasuk huruf besar.