Python'da CSV dosyası okumak için standart kütüphanedeki csv modülünü kullanırsın. Basit CSV dosyalarında csv.reader() her satırı liste olarak verir. csv.DictReader() ise ilk satırdaki sütun başlıklarını anahtar yaparak her satırı sözlük olarak okur. reader satırı konumuyla, DictReader sütun adıyla okur. Bu yüzden sütunlarla adıyla çalışacaksan DictReader kodu daha açıklayıcı kılar. Bu yazıda her adımı kendi bilgisayarında çalıştırıp çıktıyı doğrulayabileceksin. Paket kurman gerekmez.
Önce Küçük Bir CSV Dosyası Hazırla
CSV, değerlerin virgülle ayrıldığı düz bir metin dosyasıdır. İlk satır çoğunlukla sütun başlıklarını taşır, sonraki her satır bir kaydı temsil eder.
Bir metin düzenleyici aç, aşağıdaki veriyi yapıştır ve ogrenciler.csv adıyla, yazacağın Python dosyasıyla aynı klasöre kaydet. Dosyayı UTF-8 kodlamasıyla kaydetmeye dikkat et; Türkçe karakterler bu sayede doğru okunur.
ad,bolum,puan
Ayşe,Bilgisayar,85
Mehmet,Elektronik,
Zeynep,Bilgisayar,92
Can,Makine,70
Elif,Elektronik,88
Verideki küçük bir ayrıntıya dikkat et: Mehmet'in puanı boş bırakılmıştır. Gerçek dosyalarda eksik değerler sık görülür; bu durumu ilerleyen bölümlerde ele alacağız. Örneklerde eşik değeri olarak 80'i kullanacağız. Python dosyanı çalıştırdığın klasörde ogrenciler.csv yoksa dosya bulunamadı hatası alırsın; bu yüzden iki dosyanın aynı klasörde durduğundan emin ol.
open(), with ve newline: CSV Dosyası Doğru Nasıl Açılır?

Python'da dosyayı open() işleviyle açarsın. Dosyayı with bloğu içinde açarsan iş bitince Python dosyayı senin yerine kapatır; close() yazmayı unutma riskin kalmaz. Dosya işlemlerine geçmeden önce değişken, döngü ve koşul konularını sağlamlaştırmak istersen ücretsiz Sıfırdan Temel Python video eğitimi bu temelleri kendi hızında izleyerek tamamlamana yardımcı olabilir.
CSV için açılış satırında iki parametre öne çıkar:
newline="": Satır sonlarınıcsvmodülünün kendisi yönetsin diye verilir. Python'ın resmîcsvbelgesi, dosya nesnesinin bu parametreyle açılmasını önerir. Tırnak içinde yeni satır barındıran alanlar da böylece doğru işlenir.encoding="utf-8": Dosyanın hangi kodlamayla okunacağını açıkça belirtir. Kodlamayı yazmazsan Python işletim sisteminin varsayılanını kullanır ve Türkçe karakterler farklı bilgisayarlarda farklı davranabilir.
with open("ogrenciler.csv", newline="", encoding="utf-8") as dosya:
ilk_satir = dosya.readline()
print(repr(ilk_satir))
Bu kod dosyanın yalnızca ilk satırını okuyup ekrana yazar. Beklenen çıktı şudur:
'ad,bolum,puann'
Dosyanı Windows satır sonuyla kaydettiysen sonda rn görebilirsin; bu normaldir. repr() kullanmamızın nedeni, görünmeyen karakterlerin de ekranda belli olmasıdır.
Excel'den kaydedilmiş bir CSV dosyasında başa BOM adı verilen görünmez bir işaret eklenmiş olabilir. Bu durumda ilk sütun adı ad yerine başında garip bir karakterle gelir ve ileride satir["ad"] gibi bir erişim hata verebilir. Python'ın kodek belgesine göre utf-8-sig kodlaması okurken bu işareti atlar. Böyle bir dosyayla karşılaşırsan encoding="utf-8-sig" yazarak deneyebilirsin. Sonraki bölümlerde aynı açılış satırını kullanacağız.
csv.reader ve csv.DictReader Aynı Dosyada Nasıl Farklı Çalışır?
İki okuyucu aynı dosyayı okur, ama sana verdiği şey farklıdır. reader satırı konumuyla, DictReader sütun adıyla okur. Aynı ogrenciler.csv dosyasıyla ikisini de deneyelim.
Örnek 1: csv.reader ile liste olarak okuma
Aşağıdaki kod dosyanın ilk üç satırını yazdırır. Her satır bir liste gelir. İlk satır başlık satırının kendisidir, çünkü reader başlığı özel olarak ayırmaz.
import csv
with open("ogrenciler.csv", newline="", encoding="utf-8-sig") as dosya:
okuyucu = csv.reader(dosya)
for sira, satir in enumerate(okuyucu):
if sira == 3:
break
print(satir)
Beklenen çıktı:
['ad', 'bolum', 'puan']
['Ayşe', 'Bilgisayar', '85']
['Mehmet', 'Elektronik', '']
Bu listelerde değere konumla ulaşırsın: ad için satir[0], puan için satir[2]. Mehmet'in puanı boş olduğu için üçüncü eleman boş metindir.
Örnek 2: csv.DictReader ile sözlük olarak okuma
Alan adları (fieldnames) verilmezse DictReader dosyanın ilk satırını alan adı olarak kullanır ve o satırı sonuçlardan çıkarır. Başlık satırını elle atlaman gerekmez. Her satıra sözlük gibi anahtarla erişirsin.
import csv
with open("ogrenciler.csv", newline="", encoding="utf-8-sig") as dosya:
okuyucu = csv.DictReader(dosya)
satir = next(okuyucu)
print(satir["ad"], satir["bolum"], satir["puan"])
Beklenen çıktı:
Ayşe Bilgisayar 85
Burada next(okuyucu) ilk veri satırını, yani Ayşe'nin satırını alır. Başlık satırı zaten alan adı olarak kullanıldığı için karşına çıkmaz.
Hangisini seçmelisin?
Sütun sırası değişirse reader koduna dokunmadığın hâlde yanlış sütunu okuyabilir. Örneğin dosyaya başa yeni bir sütun eklenirse satir[2] artık puanı göstermez ve hata mesajı da vermez. DictReader ise sütun adına bağlı kaldığı için sıra değişse de satir["puan"] doğru değeri getirir. Kodu okuyan kişi de satir[2] yerine satir["puan"] gördüğünde neyin okunduğunu hemen anlar. Sütun adıyla çalışmak istediğin çoğu başlangıç projesinde DictReader daha açıklayıcı bir seçimdir.
DictReader Değerleri Neden Metin Gelir? Puanı int'e Çevirmek

CSV dosyası düz metindir ve csv modülü hiçbir değeri kendiliğinden sayıya çevirmez. Puan sütunu da dâhil olmak üzere her değer str gelir. Bunu ilk veri satırında görebilirsin:
import csv
with open("ogrenciler.csv", newline="", encoding="utf-8-sig") as dosya:
okuyucu = csv.DictReader(dosya)
satir = next(okuyucu)
print(satir["puan"], type(satir["puan"]))
Beklenen çıktı:
85 <class 'str'>
Ekranda 85 görünse de bu bir sayı değil, iki karakterlik bir metindir. Bu yüzden satir["puan"] > 80 karşılaştırması TypeError verir: metin ile tam sayı > ile kıyaslanamaz. Çözüm, karşılaştırmadan önce dönüşümü yapmaktır:
puan = int(satir["puan"])
print(puan > 80)
Beklenen çıktı:
True
Dönüşümün bir sınırı var: Mehmet'in satırında puan boş olduğu için int("") çağrısı ValueError ile durur. Boş değerleri atlayarak bu hatayı önlemeyi sıradaki mini örnekte yapacaksın.
Mini Örnek: Boş Puanı Atla, Eşiğin Üstündekileri Seç
Şimdiye kadarki parçaları tek bir çalışan programda birleştirelim. Aynı ogrenciler.csv dosyasını (başlık satırı ve 5 öğrenci) kullanıyoruz. Program puanı boş olan satırı atlıyor, kalanlardan puanı eşiğin üstünde olanları listeliyor.
import csv
ESIK = 80
secilenler = []
with open("ogrenciler.csv", newline="", encoding="utf-8") as dosya:
okuyucu = csv.DictReader(dosya)
for satir in okuyucu:
puan_metni = satir["puan"].strip()
if puan_metni == "":
continue
puan = int(puan_metni)
if puan > ESIK:
secilenler.append((satir["ad"], satir["bolum"], puan))
for ad, bolum, puan in secilenler:
print(f"{ad} ({bolum}): {puan}")
Beklenen çıktı:
Ayşe (Bilgisayar): 85
Zeynep (Bilgisayar): 92
Elif (Elektronik): 88
Kodu satır satır okuyalım
import csv: standart kütüphanedeki CSV modülünü çağırır, kurulum gerekmez.ESIK = 80: eşiği tek yerde tutan sabittir. Değeri değiştirmek için kodun başka yerine dokunmazsın.secilenler = []: seçilen öğrencileri biriktireceğimiz boş listedir.with open(...): dosyayı açar ve blok bitince otomatik kapatır.newline=""veencoding="utf-8"ayarları önceki bölümde anlatıldığı gibi kalır.csv.DictReader(dosya): ilk satırı sütun adı olarak alır, her satırısatir["puan"]gibi erişilebilen bir sözlüğe çevirir..strip(): değerin başındaki ve sonundaki boşlukları siler. Yalnızca boşluk içeren bir hücre de böylece boş metne dönüşür.if puan_metni == "": continue: puanı boş olan satırı (Mehmet) atlar ve döngü sonraki satırla devam eder. Bu kontrol olmasaint("")hata verirdi.int(puan_metni): metni sayıya çevirir, böylece karşılaştırma sayısal yapılır.puan > ESIK: "büyüktür" kullandığımız için puanı tam 80 olan biri de listeye girmez. Can'ın 70 puanı da bu yüzden elenir.append((ad, bolum, puan)): üç değeri tek bir demet olarak listeye ekler.- Son döngü, demeti
ad, bolum, puanolarak açar ve f-string ile yazdırır.
Şimdi ESIK değerini 85 yapıp programı yeniden çalıştır. 85 sınırın üstünde sayılmadığı için Ayşe listeden çıkar, çıktıda yalnızca Zeynep ve Elif kalır. > yerine >= yazarsan sonucun nasıl değiştiğini de denemeni öneririm.
Sık Karşılaşılan Üç Hata: Dosya Yolu, Türkçe Karakter ve Noktalı Virgül
1. FileNotFoundError: dosya bulunamıyor
Terminalde FileNotFoundError: [Errno 2] No such file or directory: 'ogrenciler.csv' görüyorsan Python dosyayı bulamamış demektir. open("ogrenciler.csv") göreli bir yoldur ve programı çalıştırdığın klasöre bakar. Şunları kontrol et:
- CSV dosyası ile
.pydosyası aynı klasörde mi? - Dosya adı ve uzantı birebir aynı mı? Bazı sistemler uzantıyı gizlediği için
ogrenciler.csv.txtgibi bir ad oluşmuş olabilir. - Gerekirse tam yol ver. Windows'ta ters eğik çizgi kaçış karakteri sayıldığından yolu ham metin olarak yaz:
r"C:UsersadDesktopogrenciler.csv". Düz eğik çizgi ("C:/Users/ad/Desktop/ogrenciler.csv") de çalışır.
2. Türkçe karakterler bozuk görünüyor
Ayşe yerine anlamsız simgeler görüyorsan dosyanın kaydedildiği kodlama ile open() içinde verdiğin encoding uyuşmuyordur. Dosya UTF-8 ise encoding="utf-8" yeterlidir. Dosyayı Excel'den kaydettiysen başa BOM denen görünmez bir işaret eklenmiş olabilir. Bu durumda ilk sütun adı 'ufeffad' gibi görünür ve satir["ad"] KeyError verir. encoding="utf-8-sig" yazarak bu işareti atabilirsin.
3. Satır tek sütun gibi okunuyor: noktalı virgül ayırıcı
Bazı programlar, bilgisayarın bölgesel ayarında ondalık ayracı virgül olduğunda alan ayırıcı olarak noktalı virgül kullanabilir. Excel de CSV'yi işletim sisteminin liste ayırıcı ayarına göre kaydeder; Türkçe bölgesel ayarda bu çoğu zaman noktalı virgüldür. Belirtisi şudur: tüm satır tek bir sütunmuş gibi okunur. notlar.csv dosyasının şu içeriğe sahip olduğunu düşünelim:
ad;puan
Ayşe;85
import csv
with open("notlar.csv", newline="", encoding="utf-8") as dosya:
for satir in csv.DictReader(dosya, delimiter=";"):
print(satir)
Beklenen çıktı {'ad': 'Ayşe', 'puan': '85'} olur. delimiter=";" parametresini kaldırırsan çıktı {'ad;puan': 'Ayşe;85'} görünümüne döner: tek anahtar, tek değer.
Kendi seviyeni ölçmek istersen ücretsiz Python bilgi testini çözebilirsin. Sonraki küçük pratik olarak kendi okul notlarını ders, not ve tarih sütunlarıyla bir CSV dosyasına yaz, ortalamanı hesaplayan bir program hazırla.
Sık Sorulan Sorular
CSV dosyasının ilk satırını (başlık satırını) csv.reader ile nasıl atlarım?
Döngüden önce okuyucuya next(okuyucu) uygula. Bu çağrı ilk satırı tüketir, döngü ikinci satırdan başlar. DictReader kullanırsan ilk satır zaten sütun adı olarak alındığı için ayrıca atlamana gerek kalmaz.
CSV dosyasının ayırıcısının virgül mü noktalı virgül mü olduğunu nasıl anlarım?
Dosyayı Not Defteri gibi bir metin düzenleyicide açıp ilk satıra bak: sütun adlarını ayıran karakter ayırıcıdır. Standart kütüphanedeki csv.Sniffer de dosyadan bir örnek alıp ayırıcıyı tahmin edebilir. Yine de dosyayı gözle kontrol etmek en güvenli yoldur.
CSV okumayı bir kez oturttuktan sonra aynı kalıp başka dosyalarda da işine yarar: dosyayı doğru aç, satırları sütun adıyla oku, değerleri kullanmadan önce türünü dönüştür.