İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python CSV Dosyası Nasıl Okunur? Satırları Sözlük Olarak İşleme

python-csv-dosyasi-nasil-okunur
Bu yazıda neler var?
  1. Önce Küçük Bir CSV Dosyası Hazırla
  2. open(), with ve newline: CSV Dosyası Doğru Nasıl Açılır?
  3. csv.reader ve csv.DictReader Aynı Dosyada Nasıl Farklı Çalışır?
  4. DictReader Değerleri Neden Metin Gelir? Puanı int'e Çevirmek
  5. Mini Örnek: Boş Puanı Atla, Eşiğin Üstündekileri Seç
  6. Sık Karşılaşılan Üç Hata: Dosya Yolu, Türkçe Karakter ve Noktalı Virgül
  7. Sık Sorulan Sorular

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?

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ı csv modülünün kendisi yönetsin diye verilir. Python'ın resmî csv belgesi, 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

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

  1. import csv: standart kütüphanedeki CSV modülünü çağırır, kurulum gerekmez.
  2. ESIK = 80: eşiği tek yerde tutan sabittir. Değeri değiştirmek için kodun başka yerine dokunmazsın.
  3. secilenler = []: seçilen öğrencileri biriktireceğimiz boş listedir.
  4. with open(...): dosyayı açar ve blok bitince otomatik kapatır. newline="" ve encoding="utf-8" ayarları önceki bölümde anlatıldığı gibi kalır.
  5. 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.
  6. .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.
  7. if puan_metni == "": continue: puanı boş olan satırı (Mehmet) atlar ve döngü sonraki satırla devam eder. Bu kontrol olmasa int("") hata verirdi.
  8. int(puan_metni): metni sayıya çevirir, böylece karşılaştırma sayısal yapılır.
  9. 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.
  10. append((ad, bolum, puan)): üç değeri tek bir demet olarak listeye ekler.
  11. Son döngü, demeti ad, bolum, puan olarak 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 .py dosyası aynı klasörde mi?
  • Dosya adı ve uzantı birebir aynı mı? Bazı sistemler uzantıyı gizlediği için ogrenciler.csv.txt gibi 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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara