Excel Dosyalarını Python ile Okumak (openpyxl)
Bir önceki derste, Python ile klasik metin ve CSV dosyalarını nasıl okuyup yazacağımızı görmüştük. Şimdi bir adım öteye geçip, gerçek dünyada en sık karşılaşılan dosya biçimlerinden biri olan Excel (.xlsx) dosyalarını Python'dan okumayı öğreneceğiz. Bu ders, seri halindeki 4. derstir ve bir sonraki derste (5/8) öğreneceğimiz "openpyxl ile Excel'e veri yazma ve dosya oluşturma" konusunun temelini oluşturur. Yani burada kurduğumuz kavramlar bir sonraki derste doğrudan işimize yarayacak.
Bu derste ne yapacağız?
Bu derste, bilgisayarımızda zaten var olan bir .xlsx uzantılı Excel dosyasını Python programımız içinden açacak, içindeki sayfalara (sheet) erişecek, satır ve sütunlardaki hücre değerlerini teker teker veya toplu şekilde okuyacağız. Amacımız, bir muhasebe tablosunu, bir öğrenci not listesini veya bir stok tablosunu elle açıp okumak yerine, Python'a "bu dosyayı aç, şu bilgileri bana ver" dedirtmektir.
Ön koşul olarak, önceki derslerde gördüğümüz temel Python söz dizimini (değişkenler, döngüler, listeler) ve dosya yollarının nasıl yazıldığını bilmemiz yeterlidir. Ayrıca bilgisayarınızda openpyxl adlı kütüphanenin kurulu olması gerekir. Kurulu değilse, komut satırında (terminal veya PowerShell) şu komutu çalıştırarak kurabilirsiniz: pip install openpyxl. Bu derste ayrıca üzerinde çalışacağımız örnek bir Excel dosyasına ihtiyacımız olacak; kendi bilgisayarınızda basit bir tablo (örneğin isim ve not sütunları) içeren bir .xlsx dosyası hazırlamanız yeterlidir.
Kavram
Bir Excel dosyasını bir apartman binası gibi düşünebiliriz. Dosyanın kendisi bina (workbook)dır. Bu binanın içinde birden fazla kat (sheet / çalışma sayfası) bulunabilir; genelde "Sayfa1", "Ocak", "Şubat" gibi isimlerle anılırlar. Her katın içinde de daireler (hücreler / cell) vardır ve her dairenin bir adresi vardır: örneğin A1, B2, C10 gibi. A harfi sütunu (yatay konum), rakam ise satırı (dikey konum) belirtir.
openpyxl kütüphanesi, Python'a bu binanın kapısını açma, doğru kata çıkma ve istediğimiz dairenin içine bakma yeteneği kazandırır. Yani load_workbook fonksiyonu binanın kapısını açar, workbook["SayfaAdı"] ifadesi doğru kata çıkmamızı sağlar, hücre erişimi ise belirli bir dairenin içindeki eşyayı (veriyi) görmemizi sağlar. Bu benzetmeyi aklınızda tuttuğunuzda, kodun her satırının ne yaptığını çok daha kolay hatırlarsınız.
Önemli bir ayrım daha var: openpyxl varsayılan olarak dosyayı salt okunur (read-only) olmayan ama "formül sonuçlarını değil formülün kendisini" gösteren bir modda açar. Yani bir hücrede =TOPLA(A1:A5) gibi bir formül varsa, openpyxl bu formülün kendisini okur, hesaplanmış sonucu değil. Bu, ders içinde göreceğimiz data_only=True seçeneğiyle değiştirilebilir; ancak bu seçeneğin çalışması için dosyanın daha önce Excel programında bir kez açılıp kaydedilmiş olması gerekir, çünkü hesaplanmış değerler dosyanın içine ancak Excel tarafından yazılır.
Adım adım uygulama
- Öncelikle çalışma klasörünüzde notlar.xlsx adında basit bir Excel dosyası olduğunu varsayalım. Bu dosyanın ilk sayfasında A sütununda öğrenci isimleri, B sütununda ise notları bulunsun; birinci satır ise "Ad" ve "Not" gibi başlıkları içersin.
- Python dosyanızın en üstüne şu satırı yazarak gerekli fonksiyonu içe aktarın: from openpyxl import load_workbook — Bu satır, openpyxl kütüphanesi içindeki load_workbook adlı fonksiyonu programımıza dahil eder; bu fonksiyon olmadan bir Excel dosyasını açamayız.
- Dosyayı açmak için şu satırı ekleyin: kitap = load_workbook("notlar.xlsx") — Bu satır, belirtilen yoldaki Excel dosyasını açar ve tüm içeriğini kitap adlı bir değişkende (workbook nesnesinde) tutar. Dosya yolu göreli ise, Python dosyanızla aynı klasörde olmalıdır; farklı bir klasördeyse tam yolu yazmanız gerekir.
- Kaç tane sayfa (sheet) olduğunu ve isimlerini görmek için şunu yazabilirsiniz: print(kitap.sheetnames) — Bu satır, dosyadaki tüm sayfa isimlerini bir liste olarak ekrana yazdırır; böylece hangi sayfayla çalışmak istediğinizi öğrenirsiniz.
- Çalışmak istediğiniz sayfayı seçin: sayfa = kitap["Sayfa1"] veya sayfa isimlerini bilmiyorsanız sayfa = kitap.active — İkinci yöntem, dosya açıldığında aktif olan (en son görüntülenen) sayfayı otomatik olarak seçer.
- Tek bir hücrenin değerini okumak için: deger = sayfa["A1"].value — Bu satır, A1 adresindeki hücrenin içindeki veriyi alır ve deger değişkenine atar. Metinse yazı (string), sayıysa sayı (int veya float) türünde gelir.
- Satır ve sütun sayısını öğrenmek isterseniz: print(sayfa.max_row, sayfa.max_column) — Bu, sayfada veri içeren en son satır ve sütun numaralarını verir; böylece döngü kurarken sınırları bilirsiniz.
- Tüm satırları sırayla gezmek için bir döngü kurun: for satir in sayfa.iter_rows(min_row=2, values_only=True): print(satir) — Bu döngü, ikinci satırdan (başlık satırını atlayarak) başlayıp sayfanın sonuna kadar her satırı bir demet (tuple) olarak döndürür; values_only=True parametresi sayesinde hücre nesneleri yerine doğrudan değerleri alırız, bu da kodu sadeleştirir.
- Belirli bir sütundaki tüm değerleri toplamak gibi basit bir işlem yapmak isterseniz, döngü içinde her satırdan ilgili sütun değerini alıp bir listeye ekleyebilir veya toplamını hesaplayabilirsiniz; örneğin notların ortalamasını bulmak için önce tüm notları bir listeye toplayıp ardından sum(liste) / len(liste) ifadesiyle ortalamayı hesaplayabilirsiniz.
- İşiniz bittiğinde dosyayı kapatmanız openpyxl'de zorunlu değildir çünkü sadece okuma yaptık ve dosyada değişiklik yapmadık; ancak büyük dosyalarla çalışırken bellek kullanımını azaltmak isterseniz load_workbook fonksiyonuna read_only=True parametresini ekleyebilirsiniz.
Sık karşılaşılan sorunlar
| Hata / Belirti | Olası Sebep ve Çözüm |
|---|---|
| FileNotFoundError | Belirttiğiniz dosya yolu yanlış veya dosya Python dosyanızla aynı klasörde değil. Dosyanın tam yolunu kontrol edin veya dosyayı Python dosyanızla aynı klasöre taşıyın. |
| ModuleNotFoundError: No module named 'openpyxl' | Kütüphane bilgisayarınıza kurulmamış. Terminalde pip install openpyxl komutunu çalıştırın. |
| Hücre değeri None geliyor | Hücre gerçekten boş olabilir, ya da yanlış hücre adresine bakıyor olabilirsiniz. Sayfa üzerinde ilgili hücreyi Excel'de açıp kontrol edin. |
| Formül sonucu yerine formülün kendisi geliyor (örneğin =TOPLA(...)) | openpyxl varsayılan olarak formülü okur, sonucu değil. Dosyayı açarken load_workbook("dosya.xlsx", data_only=True) kullanın; ancak dosyanın daha önce Excel'de kaydedilmiş olması gerekir. |
| KeyError: 'SayfaAdı' | Belirttiğiniz sayfa ismi dosyada yok veya yazım hatası var. Önce kitap.sheetnames ile mevcut sayfa isimlerini kontrol edin. |
| PermissionError dosya açılırken | Dosya başka bir programda (örneğin Excel'de) açık durumda. Dosyayı Excel'de kapatıp tekrar deneyin. |
Mini görev
Kendi bilgisayarınızda, en az üç sütun (Ad, Şehir, Yaş gibi) ve en az beş satır veri içeren basit bir Excel dosyası oluşturun ve kisiler.xlsx adıyla kaydedin. Ardından bir Python dosyası yazarak şu işlemleri yapın: dosyayı açın, sayfa isimlerini ekrana yazdırın, başlık satırını atlayarak tüm satırları döngüyle gezin ve her kişinin adını ve yaşını ekrana yazdırın. Son olarak, tüm yaşların ortalamasını hesaplayıp ekrana yazdırın.
Kontrol listesi:
- Dosya başarıyla açıldı mı, hata almadınız mı?
- Sayfa isimleri doğru şekilde listelendi mi?
- Başlık satırı döngüye dahil edilmeden atlandı mı?
- Her satırdaki isim ve yaş doğru şekilde ekrana yazdırıldı mı?
- Yaş ortalaması doğru hesaplandı mı (elle kontrol ederek doğrulayın)?
Kendini sına
- 1) openpyxl kütüphanesinde bir Excel dosyasını açmak için hangi fonksiyon kullanılır?
- 2) Bir çalışma kitabındaki (workbook) sayfa isimlerini görmek için hangi özellik (attribute) kullanılır?
- 3) sayfa.iter_rows(values_only=True) ifadesindeki values_only=True parametresi ne işe yarar?
- 4) Bir hücrede formül varsa ve openpyxl'in bu formülün hesaplanmış sonucunu okumasını istiyorsak, load_workbook fonksiyonuna hangi parametreyi eklememiz gerekir?
- 5) Bir sayfadaki toplam satır ve sütun sayısını öğrenmek için hangi iki özellik kullanılır?
Cevaplar
- 1) load_workbook() fonksiyonu kullanılır; dosya yolunu parametre olarak alır ve bir workbook nesnesi döndürür.
- 2) kitap.sheetnames özelliği kullanılır; bu, dosyadaki tüm sayfa isimlerini bir liste olarak verir.
- 3) Bu parametre, her satırı hücre nesneleri yerine doğrudan değerlerden oluşan bir demet (tuple) olarak döndürür; böylece .value yazmaya gerek kalmadan veriye doğrudan erişilir.
- 4) data_only=True parametresi eklenmelidir; ancak bunun çalışması için dosyanın daha önce Excel'de bir kez kaydedilmiş olması gerekir.
- 5) sayfa.max_row ve sayfa.max_column özellikleri kullanılır; bunlar sırasıyla en son veri içeren satır ve sütun numarasını verir.
Bir sonraki derste (5/8), burada öğrendiğimiz okuma işlemlerinin tersini yapacağız: openpyxl ile sıfırdan yeni bir Excel dosyası oluşturacak, hücrelere veri yazacak ve mevcut bir dosyayı güncelleyip kaydedeceğiz. Bu derste kurduğunuz workbook, sheet ve hücre kavramları, bir sonraki derste yazma işlemlerini anlamanızı çok kolaylaştıracak.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol