Dosyalar ve basit CSV

Şimdiye kadar verilerimizi doğrudan Python kodunun içine yazdık. Program kapandığında veya kod değiştirildiğinde bu değerlerin kalıcı bir kaynağı yoktu. Gerçek uygulamalarda veriler çoğu zaman dosyalardan okunur ve sonuçlar dosyalara yazılır.

Bu hafta metin dosyalarını açmayı, okumayı ve yazmayı; ardından satır ve sütunlardan oluşan basit CSV verilerini işlemeyi öğreneceğiz. Tarayıcıdaki interaktif örneklerde gerçek bilgisayar dosya sistemine erişmek yerine aynı mantığı güvenli biçimde taklit eden bellek içi metinler kullanacağız. Normal Python ortamında kullanılacak gerçek dosya kodunu ayrıca göreceğiz.

Bu bölümün kapsamı

NoteSınavda sorulur
  • with open(...) kullanımı ve "r", "w", "a" kipleri
  • read(), readlines() ve dosya üzerinde for farkı
  • kodlama seçeneğinin etkisi ve BOM sorunu
  • CSV’de delimiter ve newline="" seçeneklerinin görevi
  • csv.DictReader alanlarının metin gelmesi ve dönüştürülmesi
  • ondalık virgül sorunu ve replace() çözümünün sınırı
  • okuma, dönüştürme ve hesaplama adımlarının ayrılması
  • csv.writer ile yazma seçeneklerinin ayrıntısı
  • pathlib ile yol işlemleri
  • ikili (binary) dosya kipleri

Bu başlıklar konunun devamıdır; ileride karşınıza çıkar ama bu derste ezberlemeniz beklenmiyor.

Excel’den gelen CSV neden tek sütun görünüyor?

Dosyadaki veri her zaman beklediğiniz biçimde olmaz: ayraç noktalı virgül olabilir, dosyanın başında görünmez bir işaret bulunabilir, ondalık ayraç virgül olabilir. Üçü ayrı sorundur ve ayrı ayrı çözülür.

Dosya neden gerekir?

Bir programın şu verilerle çalıştığını düşünelim:

puanlar = [70, 82, 91, 65]

Bu liste kodun parçasıdır. Oysa puanların başka bir program tarafından üretilmesi veya kullanıcı tarafından daha önce kaydedilmiş olması mümkündür. Böyle bir durumda veri bir dosyada tutulabilir.

puanlar.txt:

70
82
91
65

Program bu dosyayı okuyup veriyi işleyebilir.

with open(...) ile dosya açmak

with open("puanlar.txt", "r", encoding="utf-8") as dosya:
    icerik = dosya.read()

print(icerik)

Burada:

  • "puanlar.txt" dosya yoludur,
  • "r" okuma kipidir,
  • encoding="utf-8" karakterlerin nasıl çözüleceğini belirtir,
  • as dosya açılan dosya nesnesine verdiğimiz addır.

with bloğu bittiğinde dosya otomatik olarak kapatılır.

Important

Başlangıç düzeyinde dosya açarken with open(...) kalıbını varsayılan yaklaşım olarak kullanacağız.

Okuma, yazma ve ekleme kipleri

Kip Anlam
"r" Dosyayı okumak
"w" Dosyayı yazmak; varsa mevcut içeriği silip yeniden oluşturmak
"a" Dosyanın sonuna içerik eklemek (append)

"w" örneği:

with open("sonuc.txt", "w", encoding="utf-8") as dosya:
    dosya.write("İşlem tamamlandı\n")

"a" örneği:

with open("gunluk.txt", "a", encoding="utf-8") as dosya:
    dosya.write("Yeni kayıt\n")

"a" mevcut içeriği silmeden sonuna ekler. Bu, “rapora yeni satır ekle” türü işlerde kullanışlıdır.

Warning

"w" kipini yanlış dosyada kullanmak mevcut veriyi silebilir. "a" ise her çalıştırmada tekrar ekleme yapar; başlık satırını da her seferinde yazarsanız aynı başlık birden fazla kez oluşabilir. Hangi kipin veri sözleşmesine uygun olduğunu düşünün.

Dosya yolu ve çalışma dizini

open("veriler/puanlar.txt", "r", encoding="utf-8")

bu yolu programın çalışma dizinine göre arar. Dosya bulunamazsa FileNotFoundError oluşabilir.

Hata ayıklarken iki soru önemlidir:

Program hangi dizinden çalışıyor?
Dosya yolu o dizine göre doğru mu?

read(), readlines() ve satır satır okuma

Dosya içeriğini farklı biçimlerde okuyabiliriz.

read() → tek bir string

with open("puanlar.txt", "r", encoding="utf-8") as dosya:
    icerik = dosya.read()

print(type(icerik))  # str

read() dosyanın geri kalanını tek bir string olarak verir.

Bu nedenle:

with open("puanlar.txt", "r", encoding="utf-8") as dosya:
    for deger in dosya.read():
        print(deger)

satırlar üzerinde değil, karakterler üzerinde dolaşır.

readlines() → string listesi

with open("puanlar.txt", "r", encoding="utf-8") as dosya:
    satirlar = dosya.readlines()

print(type(satirlar))  # list

Her liste elemanı bir satır string’idir; çoğu satır sonunda \n bulunur.

Dosya nesnesi üzerinde for → satır satır

with open("puanlar.txt", "r", encoding="utf-8") as dosya:
    for satir in dosya:
        print(satir.strip())

Bu derste satır bazlı işlemlerde çoğunlukla doğrudan for satir in dosya biçimini kullanacağız. Büyük dosya performansı ayrıntılarına girmiyoruz; hedef, hangi yapının karakter, tek string veya satır listesi ürettiğini doğru anlamaktır.

Tarayıcı alıştırmalarında dosya mantığını simüle etmek

StringIO, metni bellek içinde dosya benzeri bir nesne olarak kullanır. Gerçek Python uygulamasında çoğunlukla with open(...) kullanılır.

Alıştırma — satırlardaki sayıları toplayın

Beklenen sonuç 500dür.

deger = int(satir.strip()) ve toplam = toplam + deger kullanabilirsiniz.

from io import StringIO

veri = """120
145
98
137
"""

dosya = StringIO(veri)
toplam = 0

for satir in dosya:
    deger = int(satir.strip())
    toplam = toplam + deger

print(toplam)

CSV nedir?

CSV, tablo biçimindeki verileri düz metin olarak saklamanın yaygın yollarından biridir. Adı “comma-separated values” ifadesinden gelir; ancak ayraç her zaman virgül değildir.

Basit örnek:

ad,puan,bolum
Deniz,78,Bilgisayar
Ayse,92,Siber
Mert,55,Bilgisayar

CSV verisini split(",") ile elle parçalamak tırnak içinde virgül gibi durumlarda hatalı olabilir. Bu nedenle Python’ın standart csv modülünü kullanacağız.

csv.reader ve newline=""

import csv

with open("ogrenciler.csv", "r", encoding="utf-8", newline="") as dosya:
    okuyucu = csv.reader(dosya)

    for satir in okuyucu:
        print(satir)

newline="", dosya satır sonlarının csv modülü tarafından kendi kurallarına göre ele alınmasını sağlar. Özellikle Windows dahil farklı platformlarda CSV okuma/yazmada gereksiz boş satır veya satır sonu dönüşümü sorunlarını önlemek için Python belgelerinde önerilen kalıptır.

Note

newline="" bir CSV ayıracı değildir. Virgül, noktalı virgül gibi sütun ayıracını delimiter belirler; newline ise metin dosyasındaki satır sonlarının işlenmesiyle ilgilidir.

csv.DictReader

import csv

with open("ogrenciler.csv", "r", encoding="utf-8", newline="") as dosya:
    okuyucu = csv.DictReader(dosya)

    for kayit in okuyucu:
        print(kayit["ad"], kayit["puan"])

Her kayit sözlük benzeri bir yapı olarak okunur. CSV’den gelen alan değerleri başlangıçta string olduğu için:

puan = int(kayit["puan"])

gibi dönüşümler gerekir.

CSV satırının DictReader ile okunup tür dönüşümleri yapılmış Python kaydına dönüştürülmesi.

CSV satırından Python kaydına

Türkiye’de Excel’den gelen CSV: ;, BOM ve ondalık virgül

Kendi oluşturduğunuz CSV dosyasında her zaman ders örneğindeki , ayıracını görmeyebilirsiniz. Türkçe bölgesel ayarlarla çalışan Excel ve benzeri tablo uygulamalarında sık karşılaşılan bir biçim şöyledir:

urun;adet;fiyat
Kalem;2;12,5
Defter;3;45,0

Bu dosyada üç ayrı konu vardır.

1. Sütun ayıracı noktalı virgül olabilir

Varsayılan csv.DictReader(dosya) virgül beklerse bütün satırı tek sütun gibi okuyabilir. Ayıracı açıkça verin:

okuyucu = csv.DictReader(dosya, delimiter=";")

2. Dosyanın başında UTF-8 BOM olabilir

Bazı programların dışa aktardığı UTF-8 CSV dosyasının başında BOM bulunabilir. Normal utf-8 ile okunduğunda ilk başlık "ad" yerine görünmez bir karakter taşıyan "\ufeffad" olabilir.

Böyle dosyalarda:

with open("veri.csv", "r", encoding="utf-8-sig", newline="") as dosya:
    okuyucu = csv.DictReader(dosya, delimiter=";")

kullanımı, varsa BOM’u okuma sırasında kaldırır. utf-8-sig, BOM olmayan UTF-8 dosyayı da okuyabilir; fakat dosyanızın gerçek kodlamasını bilmek her zaman daha iyidir.

3. Ondalık ayıracı virgül olabilir

float("12,5")

ValueError üretir; Python’ın float() sözdizimi ondalık nokta bekler. Basit ve sözleşmesi açık bir veri kümesinde yalnızca ondalık virgül kullanıldığını biliyorsanız:

fiyat_metni = kayit["fiyat"]
fiyat = float(fiyat_metni.replace(",", "."))

kullanabilirsiniz.

Bir arada:

import csv

with open("satislar.csv", "r", encoding="utf-8-sig", newline="") as dosya:
    okuyucu = csv.DictReader(dosya, delimiter=";")

    for kayit in okuyucu:
        adet = int(kayit["adet"])
        fiyat = float(kayit["fiyat"].replace(",", "."))
        print(kayit["urun"], adet, fiyat)
Warning

replace(",", ".") yalnızca veri biçiminin ondalık virgül ve binlik ayıracı yok biçiminde olduğunu bildiğiniz basit örneklerde güvenlidir. 1.234,56, 1 234,56 veya farklı bölgesel sayı biçimleri için daha açık bir veri sözleşmesi ya da uygun yerelleştirme aracı gerekir. Amaç “her CSV’yi metin değiştirerek düzeltmek” değildir.

Important

CSV biçimini dosya uzantısından tahmin etmek yerine ayraç, kodlama ve sayısal biçim sözleşmesini belirleyin. Türkiye’deki öğrencinin kendi Excel çıktısıyla karşılaşacağı ;, BOM ve 12,5 durumları bu nedenle normal veri işleme problemleridir; “Python bozuldu” anlamına gelmez.

Tarayıcıda CSV okuma

Alıştırma — geçen öğrencileri sayın

Beklenen sonuç 3tür.

puan = int(kayit["puan"]) ile başlayın.

import csv
from io import StringIO

veri = """ad,puan
Deniz,78
Ayse,92
Mert,55
Ece,60
"""

dosya = StringIO(veri)
okuyucu = csv.DictReader(dosya)
gecen_sayisi = 0

for kayit in okuyucu:
    puan = int(kayit["puan"])
    if puan >= 60:
        gecen_sayisi = gecen_sayisi + 1

print(gecen_sayisi)

CSV’den sözlük listesi üretmek

import csv

ogrenciler = []

with open("ogrenciler.csv", "r", encoding="utf-8", newline="") as dosya:
    okuyucu = csv.DictReader(dosya)

    for kayit in okuyucu:
        ogrenci = {
            "ad": kayit["ad"],
            "puan": int(kayit["puan"]),
            "bolum": kayit["bolum"]
        }
        ogrenciler.append(ogrenci)

Bu noktadan sonra 11. haftadaki liste ve sözlük işleme fonksiyonlarımız yeniden kullanılabilir:

dosyadan okuma
    ↓
türleri dönüştürme
    ↓
program içi veri yapısı
    ↓
hesaplama / filtreleme / raporlama

Çalışma klasörü, göreli yol ve with open kullanımı arasındaki ilişki.

Dosya okuma akışı

Dosyaya yazmak ve eklemek

Yeni rapor oluşturmak:

toplam = 450

with open("rapor.txt", "w", encoding="utf-8") as dosya:
    dosya.write(f"Toplam satış: {toplam:.2f} TL\n")

Mevcut günlük/rapor sonuna yeni satır eklemek:

with open("rapor.txt", "a", encoding="utf-8") as dosya:
    dosya.write("Yeni ölçüm eklendi\n")

Bu hafta csv.DictWriter gibi daha ayrıntılı CSV yazma araçlarını zorunlu kapsam yapmıyoruz; temel hedef okuma, dönüştürme ve rapor akışını kavramaktır.

Dosya kaynaklı hata durumları

Dosya işlemlerinde hata yalnızca Python sözdiziminden kaynaklanmaz:

  • Dosya bulunamıyor → FileNotFoundError,
  • Beklenen sütun yok → çoğu erişimde KeyError,
  • "puan" alanı sayı değil → ValueError,
  • Dosya boş,
  • Karakter kodlaması beklenenden farklı → UnicodeDecodeError gibi hatalar,
  • Yanlış delimiter nedeniyle beklenen sütunlar hiç oluşmamış olabilir.

13. haftada bu sözün karşılığını vereceğiz: FileNotFoundError, KeyError, ValueError gibi istisnaları try/except ile ele alacak ve hata mesajını nasıl okuyacağımızı göreceğiz.

Üret — CSV satış özeti

Fonksiyon DictReader kullanmalı, tutar alanını float değerine dönüştürmeli, toplam satış tutarı ile 100 TL ve üzeri kayıt sayısını (toplam, yuksek_satis_sayisi) olarak döndürmelidir. Beklenen sonuç (545.0, 2).

dosya = StringIO(veri), okuyucu = csv.DictReader(dosya) ve her kayıtta tutar = float(kayit["tutar"]) kullanabilirsiniz.

import csv
from io import StringIO

def csv_satis_ozeti(veri):
    dosya = StringIO(veri)
    okuyucu = csv.DictReader(dosya)

    toplam = 0
    yuksek_satis_sayisi = 0

    for kayit in okuyucu:
        tutar = float(kayit["tutar"])
        toplam = toplam + tutar

        if tutar >= 100:
            yuksek_satis_sayisi = yuksek_satis_sayisi + 1

    return toplam, yuksek_satis_sayisi

Gerçek ortam uygulaması

puanlar.txt ile şu programı kendi Python ortamınızda deneyin:

toplam = 0
adet = 0

with open("puanlar.txt", "r", encoding="utf-8") as dosya:
    for satir in dosya:
        puan = int(satir.strip())
        toplam = toplam + puan
        adet = adet + 1

print("Ortalama:", toplam / adet)

Daha sonra Excel veya başka bir tablo programından küçük bir CSV dışa aktarın. Dosyayı bir metin editöründe açıp şu üç soruya cevap verin:

  1. Sütun ayıracı ,; mi?
  2. Ondalık sayılar 12.5 mi 12,5 mi?
  3. utf-8 ile ilk sütun adı beklenmedik görünüyorsa utf-8-sig ile fark oluşuyor mu?

Bu inceleme, CSV’nin yalnızca “Excel dosyasının başka uzantısı” olmadığını; açık bir metin biçimi sözleşmesi olduğunu gösterir.

Sınav provası

Önce kendi cevabını seç; sonra cevap anahtarında her şıkkın neden doğru veya yanlış olduğunu oku. Çeldiriciler uydurma değil, bu konuda gerçekten yapılan hatalardır. Sınav maddeleri de bu mantıkla yazılır.

Madde 1. "r", "w" ve "a" kipleri arasındaki fark nedir?

  • A. Üçü de okuma kipidir; fark yalnızca hızdadır
  • B. "w" dosya yoksa hata verir
  • C. "r" okur; "w" var olan içeriği silip baştan yazar; "a" dosyanın sonuna ekler
  • D. "r" okur; "w" sona ekler; "a" içeriği siler
  • E. "r" ve "w" metin, "a" ikili dosyalar içindir

Madde 2. with open(...) yapısı ne kazandırır?

  • A. Kodlama sorunlarını kendiliğinden çözer
  • B. Dosyayı salt okunur yapar
  • C. Dosyayı daha hızlı okur
  • D. Blok bittiğinde dosyayı kendiliğinden kapatır; hata çıksa bile kapatma yapılır
  • E. Dosyanın var olduğunu garanti eder

Madde 3. read() ile readlines() hangi türde değer döndürür?

  • A. read() liste, readlines() tek metin döndürür
  • B. İkisi de liste döndürür
  • C. read() sayı, readlines() metin döndürür
  • D. İkisi de tek metin döndürür
  • E. read() dosyanın tamamını tek bir metin olarak; readlines() her satırı bir eleman olan liste olarak döndürür

Madde 4. CSV okunduğunda ilk sütun adı ad görünüyor. Hangi seçenek yardımcı olur?

  • A. Dosyayı encoding="utf-8-sig" ile açmak
  • B. newline="" eklemek
  • C. delimiter=";" vermek
  • D. Dosyayı ikili kipte açmak
  • E. Sütun adını strip() ile kırpmak yeterlidir

Madde 5. Türkçe bölgesel ayarlı bir tablo uygulamasından gelen ad;puan satırı tek sütun gibi okunuyor. Hangi ayar kontrol edilmelidir?

  • A. newline=""
  • B. delimiter=";"; sütun ayracı virgül değil noktalı virgüldür
  • C. encoding="utf-8-sig"
  • D. Dosyayı "a" kipinde açmak
  • E. Satırı split(" ") ile bölmek

Madde 6. csv.DictReader ile okunan bir satırda "78" değeri neden doğrudan sayısal puan olarak kullanılmamalıdır?

  • A. 78 geçersiz bir puan olduğu için
  • B. DictReader yalnızca başlık satırını okuduğu için
  • C. CSV’den gelen bütün alanlar metin olarak okunur; sayısal işlem için açıkça dönüştürülmelidir
  • D. Kullanılabilir; DictReader sayıları kendiliğinden dönüştürür
  • E. Tırnak işaretleri değerin parçası olduğu için

Madde 7. float("12,5") neden hata verir?

  • A. Virgül Python’da ayrılmış bir karakterdir
  • B. 12,5 çok büyük bir sayı olduğu için
  • C. float() yalnızca tam sayı kabul eder
  • D. Python ondalık ayracı olarak noktayı bekler; virgüllü yazım sayı biçimine uymaz
  • E. Değer tırnak içinde olduğu için

Madde 8. replace(",", ".") neden her yerel sayı biçimi için güvenli bir genel çözüm değildir?

  • A. replace() yalnızca ilk eşleşmeyi değiştirir
  • B. replace() metinlerde çalışmaz
  • C. Sonuç str kaldığı için dönüşüm eksik kalır
  • D. Güvenlidir; virgül her zaman ondalık ayracıdır
  • E. Bazı biçimlerde virgül binlik ayracı olarak kullanılır; 1,250 değeri noktaya çevrilirse anlamı büsbütün değişir

Madde 9. Dosya okuma, tür dönüştürme ve hesaplama adımlarını ayrı fonksiyonlara bölmenin yararı nedir?

  • A. Yanlış sonuç çıktığında hatanın hangi adımda olduğu daraltılabilir; her adım ayrı ayrı denenebilir
  • B. CSV ayracı kendiliğinden bulunur
  • C. Tür dönüşümü gereksiz hâle gelir
  • D. Dosya kapatma işlemi gereksiz hâle gelir
  • E. Dosya okuma işlemi hızlanır

Madde 1 — Doğru: C. "w" ile açmak dosyayı sıfırlar. Var olan veriyi korumak istiyorsanız "a" kullanılır.

  • A yanlış: Yalnızca "r" okuma kipidir.
  • B yanlış: "w" dosya yoksa oluşturur; hata veren "r"dir.
  • D yanlış: "w" ile "a" ters yazılmış.
  • E yanlış: İkili kip için "b" eklenir; "a" da metin kipidir.

Madde 2 — Doğru: D. Elle close() çağırmayı unutmak ya da hata yüzünden o satıra hiç gelememek sorun üretir; with bunu ortadan kaldırır.

  • A yanlış: Kodlama encoding ile ayrıca belirtilir.
  • B yanlış: Kip, open() çağrısındaki argümanla belirlenir.
  • C yanlış: Okuma hızını değiştirmez.
  • E yanlış: Dosya yoksa yine FileNotFoundError çıkar.

Madde 3 — Doğru: E. Satır satır işlemek istiyorsanız readlines() ya da doğrudan dosya üzerinde for kullanılır.

  • A yanlış: İki tür ters yazılmış.
  • B yanlış: read() tek bir string döndürür.
  • C yanlış: Dosyadan okunan içerik her zaman metindir.
  • D yanlış: readlines() liste döndürür.

Madde 4 — Doğru: A. Dosyanın başındaki BOM işareti bu kodlamayla okunurken atılır; sütun adı ad olarak gelir.

  • B yanlış: Bu satır sonu işlemeyle ilgilidir; BOM’u etkilemez.
  • C yanlış: Bu ayraç sorununu çözer; baştaki görünmez işareti kaldırmaz.
  • D yanlış: İkili kip metin çözümlemesini büsbütün ortadan kaldırır; çözüm değildir.
  • E yanlış: strip() boşluk kırpar; BOM bir boşluk karakteri değildir.

Madde 5 — Doğru: B. CSV okuyucusu varsayılan olarak virgül bekler. Ayraç farklıysa açıkça belirtilmelidir.

  • A yanlış: Bu satır sonu işlemesiyle ilgilidir; sütunları ayırmaz.
  • C yanlış: Bu, baştaki BOM işaretini çözer; sütun ayrımıyla ilgili değildir.
  • D yanlış: Kip, okunan satırın nasıl bölüneceğini değiştirmez.
  • E yanlış: Elle bölmek tırnak içindeki ayraçları yanlış işler; csv modülü bunun için vardır.

Madde 6 — Doğru: C. "78" + 1 hata verir, "78" > "9" ise beklenmedik sonuç üretir. Dönüşüm bilinçli bir adımdır.

  • A yanlış: Değer geçerlidir; sorun türünde.
  • B yanlış: Bütün satırları okur; başlığı anahtar olarak kullanır.
  • D yanlış: Böyle bir dönüşüm yapmaz.
  • E yanlış: Tırnaklar Python’daki gösterime aittir; değerin içinde değildir.

Madde 7 — Doğru: D. Basit bir sözleşmede replace(",", ".") ile dönüştürülebilir; ancak bu genel bir çözüm değildir.

  • A yanlış: Metin içinde özel bir anlamı yoktur.
  • B yanlış: Büyüklükle ilgisi yoktur.
  • C yanlış: float("12.5") sorunsuz çalışır.
  • E yanlış: float() zaten metin alır; sorun metnin biçimi.

Madde 8 — Doğru: E. Basit değiştirme, virgülün hangi rolde olduğunu bilmez. Bu yüzden ancak bilinen ve dar bir sözleşmede kullanılır.

  • A yanlış: Varsayılan davranışta bütün eşleşmeleri değiştirir.
  • B yanlış: Metinlerde çalışır; sorun neyi değiştirdiğini bilmemesi.
  • C yanlış: Sonuç metindir ama zaten sonrasında float() uygulanır.
  • D yanlış: Birçok yerel biçimde virgül binlik ayracıdır.

Madde 9 — Doğru: A. Bozuk bir CSV alanı ile yanlış bir ortalama formülü çok farklı sorunlardır; ayrılmış adımlar bunları karıştırmaz.

  • B yanlış: Ayraç yine açıkça verilir.
  • C yanlış: Dönüşüm yine yapılır; yalnızca kendi fonksiyonuna taşınır.
  • D yanlış: Kapatma sorumluluğu with ile zaten çözülür; bölmeyle ilgisi yoktur.
  • E yanlış: Okuma hızı değişmez.

Tek sayfa özet

  • with open(...) dosyayı güvenli biçimde açıp blok sonunda kapatır.
  • "r" okuma, "w" mevcut içeriği yeniden yazar, "a" dosyanın sonuna ekler.
  • read() tek string, readlines() string listesi üretir; doğrudan dosya üzerinde for satır satır dolaşır.
  • encoding="utf-8" metnin doğru çözümlenmesine yardım eder; BOM içeren UTF-8 CSV için utf-8-sig gerekebilir.
  • CSV ile newline="" kullanmak satır sonu işleme sorumluluğunu csv modülüne bırakır.
  • CSV sütun ayıracı her zaman virgül değildir; delimiter=";" gibi açıkça belirtilebilir.
  • Türkçe bölgesel ayarlı tablo uygulamalarından gelen CSV’lerde noktalı virgül ve ondalık virgül sık görülebilir.
  • Basit 12,512.5 dönüşümünde replace() kullanılabilir; karmaşık yerel sayı biçimleri için bu genel çözüm değildir.
  • csv.DictReader sütun adlarını anahtar olarak kullanır ve alanlar başlangıçta string gelir.
  • Dosya okuma, tür dönüştürme ve hesaplama adımlarını ayırmak kodu daha anlaşılır kılar.

Bir sonraki bölümde dosya ve dönüşüm hataları dahil olmak üzere istisnaları, modülleri ve sistematik hata ayıklamayı ele alacağız.

Bu bölümün kazanımları

Bu bölümü bitiren öğrenci:

  • with open(...) ile dosyayı güvenli açar ve "r", "w", "a" kiplerini ayırır.
  • read(), readlines() ve dosya üzerinde for davranışlarını ayırır.
  • Kodlama seçeneğinin metni nasıl etkilediğini bilir ve BOM sorununu tanır.
  • CSV’de delimiter ve newline="" seçeneklerinin görevini açıklar.
  • csv.DictReader alanlarının metin geldiğini bilir ve dönüştürür.
  • Ondalık virgül sorununu ele alır ve replace() çözümünün sınırını bilir.
  • Okuma, dönüştürme ve hesaplama adımlarını birbirinden ayırır.
Back to top