Excel'den Python'a Veri Aktarımı İçin Pratik Rehber

Kerem Aydın·10 Temmuz 2026·⏱3 dk

Python'da bir Excel dosyasını okumak için pandas kütüphanesinden pd.read_excel() fonksiyonunu kullanın. Temel sözdizimi şöyledir: df = pd.read_excel('dosya_yolu.xlsx'). Bu komut, çalışmanın ilk sayfasını analiz için hazır bir DataFrame nesnesine otomatik olarak yükler. Çalışmak için mutlaka kurulu bir motor gereklidir (örneğin, modern .xlsx dosyaları için openpyxl).

Ortam Hazırlığı ve Bağımlılıkların Kurulumu

read_excel fonksiyonu, ek motor kütüphaneleri olmadan "kutudan çıkar çıkmaz" çalışmaz. Motor seçimi dosya formatına bağlıdır:

  • .xlsx, .xlsm, .xlsb: openpyxl (önerilir) veya odfpy kütüphanesi gereklidir.
  • .xls (eski format): xlrd (2.0'dan önceki sürümler) gereklidir.

Gerekli paketleri kurmak için terminalde şunu çalıştırın:

pip install pandas openpyxl

Kurulumdan sonra kütüphaneyi betiğinize aktarın:

import pandas as pd

Modern formatlarla çalışıyorsanız her zaman açıkça engine='openpyxl' parametresini belirtin. Bu, otomatik algılama hatalarından kurtulmanızı sağlar ve yüklemeyi hızlandırır.

Temel Sözdizimi ve Sayfa Seçimi

Varsayılan olarak fonksiyon, çalışmanın ilk sayfasını okur. Ancak gerçek veriler genellikle farklı sekmelere dağılmıştır. Sayfa seçimi sheet_name parametresi aracılığıyla yönetilir.

Belirli Bir Sayfayı Okuma

Bir sayfaya ismine göre (dize) veya indeksine göre (sayı, burada 0 ilk sayfadır) erişebilirsiniz:

# Sayfa adına göre okuma
df_sales = pd.read_excel("report.xlsx", sheet_name="Satışlar")

# İndekse göre okuma (ikinci sayfa)
df_stats = pd.read_excel("report.xlsx", sheet_name=1)

Tüm Sayfaları Aynı Anda Okuma

Tüm çalışmayı tamamen yüklemeniz gerekiyorsa, sheet_name=None değerini iletin. Sonuç, anahtarların sayfa isimleri ve değerlerin ilgili DataFrame'ler olduğu bir sözlük olacaktır:

all_sheets = pd.read_excel("book.xlsx", sheet_name=None)

# Sözlükten belirli bir sayfanın verilerine erişim
df_january = all_sheets["Ocak"]

Veri Aktarımının İnce Ayarı

Excel'deki kirli veriler sık karşılaşılan bir sorundur. Fonksiyon parametreleri, bellek ve zaman tasarrufu sağlayarak fazlalıkları okuma aşamasında elemeye olanak tanır.

Belirli Sütunları Seçme

Yalnızca gerekli sütunları yüklemek için usecols kullanın. Bu, ağır dosyalar için kritik öneme sahiptir.

# Yalnızca A, C ve E sütunlarını yükleme
df = pd.read_excel("data.xlsx", usecols="A,C,E")

# Başlık isimlerine göre yükleme
df = pd.read_excel("data.xlsx", usecols=["Tarih", "Tutar", "Müşteri"])

Başlıklar ve Atlamalarla Çalışma

Dosyada başlık yoksa veya başlık ilk satırda değilse, header ve names parametrelerini ayarlayın. Boş hücreleri işlemek için na_values kullanın.

df = pd.read_excel(
    "raw_data.xlsx",
    header=1,                # Başlık ikinci satırda yer alıyor (indeks 1)
    names=["ID", "Val", "Note"], # header=None ise zorunlu isimler
    na_values=["-", "n/a", "NULL"], # Bu değerleri NaN olarak kabul et
    skiprows=3               # İlk 3 satırı atla (örneğin, hizmet bilgileri)
)

Finansal raporlar için veri tiplerinin otomatik algılanmasına güvenmeyin. Tarihler dize olarak, başındaki sıfırlarla gelen sayılar (ürün kodları) ise sayı olarak okunabilir. Yüklemeden sonra her zaman .dtypes kontrolünü yapın.

Büyük Dosyalarla Çalışmanın Optimizasyonu

Devasa bir Excel dosyasını tamamen yüklemeye çalışmak MemoryError hatasına yol açabilir. Kısmi yükleme stratejisini kullanın.

  1. Satır Sınırlaması: nrows parametresi yalnızca belirtilen sayıda satırı okur. Mantığı verilerin bir kısmında test etmek için kullanışlıdır.
    df_sample = pd.read_excel("big_data.xlsx", nrows=1000)
    ```
2.  **Yinelemeli İşleme (Chunking)**: `read_excel`, `read_csv` kadar esnek bir şekilde doğrudan `chunksize` desteklemese de, döngü içinde `skiprows` ve `nrows` kombinasyonunu kullanabilir veya akış işleme için dosyayı önceden CSV'ye dönüştürebilirsiniz.

Büyük hacimler için en etkili yaklaşım, yalnızca gerekli sütunları (`usecols`) okumak ve seçim mantığı üzerinden mümkünse içe aktarma sırasında satırları filtrelemektir.

## Tipik Hatalar ve Çözüm Yolları

<div class="table-container"><table style="border-collapse: collapse; width: 100%; margin: 16px 0;"><thead><tr><th style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; background: #f9fafb; font-weight: 600;">Sorun</th><th style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; background: #f9fafb; font-weight: 600;">Neden</th><th style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; background: #f9fafb; font-weight: 600;">Çözüm</th></tr></thead><tbody><tr><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;"><strong>ImportError: Missing optional dependency &#39;openpyxl&#39;</strong></td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;">.xlsx için motor kurulmamış</td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;"><code style="background-color: rgba(0,0,0,0.05); padding: 2px 4px; border-radius: 3px; font-family: monospace; font-size: 0.9em;">pip install openpyxl</code> çalıştırın</td></tr><tr><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;"><strong>Hatalı veri tipleri</strong></td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;">Sütunda karışık içerik</td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;"><code style="background-color: rgba(0,0,0,0.05); padding: 2px 4px; border-radius: 3px; font-family: monospace; font-size: 0.9em;">dtype</code> parametresini kullanın veya okuduktan sonra dönüştürün (<code style="background-color: rgba(0,0,0,0.05); padding: 2px 4px; border-radius: 3px; font-family: monospace; font-size: 0.9em;">pd.to<em>numeric</code>, <code style="background-color: rgba(0,0,0,0.05); padding: 2px 4px; border-radius: 3px; font-family: monospace; font-size: 0.9em;">pd.to</em>datetime</code>)</td></tr><tr><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;"><strong>Kodlama veya makro hatası</strong></td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;">Makrolu .xlsm formatı</td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;"><code style="background-color: rgba(0,0,0,0.05); padding: 2px 4px; border-radius: 3px; font-family: monospace; font-size: 0.9em;">openpyxl</code> makroları yoksayar ancak verileri okur. Karmaşık durumlar için önceden .xlsx&#39;e dönüştürün</td></tr><tr><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;"><strong>Dosya kilitlemesi</strong></td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;">Dosya başka bir işlemde açık</td><td style="border: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top;">Betiği çalıştırmadan önce dosyayı Excel&#39;de kapatın</td></tr></tbody></table></div>


## Sıkça Sorulan Sorular (SSS)

**Parola korumalı bir dosyayı nasıl okurum?**
`pandas` kütüphanesi şifrelenmiş dosyaları doğrudan okumayı desteklemez. İçe aktarmadan önce korumayı Excel'in kendisinde kaldırmanız veya şifre çözme için üçüncü taraf yardımcı programları kullanmanız gerekir.

**Kapalı bir Excel kitabından veri okunabilir mi?**
Evet, `pandas` dosyayı diskten okur, bu nedenle Excel programında açık olmamalıdır. Dosya bir kullanıcı tarafından açıksa, işletim sistemi okuma erişimini engelleyebilir ve bu da `PermissionError` hatasına neden olur.

**Sonucu tekrar Excel'e nasıl kaydederim?**
`.to_excel()` yöntemini kullanın. Örnek: `df.to_excel("output.xlsx", index=False, engine="openpyxl")`. `index=False` parametresi, pandas satır numaralandırmasını ayrı bir sütuna kaydetmemek için önemlidir.

**Tarihler dize olarak okunursa ne yapmalıyım?**
Yüklemeden sonra dönüştürme uygulayın: `df['Tarih'] = pd.to_datetime(df['Tarih'], format='%d.%m.%Y', errors='coerce')`. `errors='coerce'` parametresi, hatalı tarihleri hata vermek yerine `NaT` değerine dönüştürür.