Python csv Modülü: CSV Okuma, Yazma ve Türkçe Karakter Sorunları
Beceri rehberi

Python csv Modülü: CSV Okuma, Yazma ve Türkçe Karakter Sorunları

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

Python'da CSV dosyasını csv modülüyle okumayı ve yazmayı, noktalı virgül ayracını ve Türkçe karakter bozulmalarını nasıl çözeceğinizi örneklerle öğrenirsiniz.

Bir bakışta

  1. csv modülü satırı elle bölmekten güvenlidir. Tırnak içindeki virgülleri ve satır sonlarını doğru ele alır.
  2. Başlıklı dosyada DictReader tercih edin. Sütun adıyla erişim, sütun sırası değişse bile kodu korur.
  3. Her değer metin olarak gelir. Sayıya dönüştürme sizin görevinizdir.
  4. newline="" ve encoding her zaman yazılmalı. Python belgeleri newline="" önerir; kodlamayı open işlevi yönetir.
  5. Türkçe Excel noktalı virgül kullanabilir. delimiter=";" parametresi ayracı değiştirir.

csv modülü ne yapar

Python'un standart kütüphanesindeki csv modülü, virgül ya da başka bir ayraçla ayrılmış metin dosyalarını satır satır okur ve yazar. CSV dosyası basit görünür ama tırnak içindeki virgüller, satır içi satır sonları ve farklı ayraçlar gibi ayrıntılar yüzünden satırı elle bölmek (split) güvenilir değildir. csv modülü bu ayrıntıları sizin yerinize ele alır.

Modül iki katmanda çalışır. Birincisi liste tabanlı csv.reader ve csv.writer'dır: her satır bir liste olarak gelir ve liste olarak yazılır. İkincisi sözlük tabanlı csv.DictReader ve csv.DictWriter'dır: ilk satırı sütun adı kabul eder ve her satırı sütun adlarına göre bir sözlük olarak verir. Başlıklı dosyalarda sözlük tabanlı yol, sütun sırası değişse bile kodun bozulmamasını sağlar.

Python belgelerinin belirttiği önemli bir nokta, okunan her değerin metin (str) olarak gelmesidir. Modül sayıyı otomatik dönüştürmez; sayısal hesap yapacaksanız int ya da float ile kendiniz çevirmeniz gerekir. Çok büyük tablolarda analiz yapacaksanız pandas ile okumak daha pratiktir, ancak küçük ve orta boyutlu dosyalarda, ek kütüphane gerektirmeyen csv modülü yeterlidir.

Dosya ve klasör işlemlerinin genel anlatımı, örneğin dosyaları toplu yeniden adlandırma ya da klasör tarama, ayrı bir konudur. Burada yalnız CSV biçiminin okunması ve yazılması ele alınır.

CSV dosyasını okumak

Temel okuma şu kalıpla yapılır:

import csv

with open("musteriler.csv", newline="", encoding="utf-8") as f: okuyucu = csv.reader(f) for satir in okuyucu: print(satir)

Her satır bir liste olarak gelir. Dosyayı with bloğuyla açmak, iş bitince dosyanın kapanmasını garanti eder.

Burada iki parametre kritiktir. newline="" Python belgelerinin önerdiği kullanımdır: bu belirtilmezse tırnaklı alanlar içindeki satır sonları doğru yorumlanmayabilir. encoding ise dosyanın karakter kodlamasını söyler; modülün kendisi kodlamayı yönetmez, dosyayı açan open işlevi yönetir.

Başlıklı dosyada DictReader daha okunaklıdır:

with open("musteriler.csv", newline="", encoding="utf-8") as f: for kayit in csv.DictReader(f): print(kayit["ad"], kayit["sehir"])

Belgelere göre fieldnames verilmezse ilk satır sütun adı olarak kullanılır ve sonuçlara dahil edilmez. Satırda başlıktan fazla değer varsa restkey, eksik değer varsa restval ile ne yapılacağını belirleyebilirsiniz.

Sonuçları işlemek için çoğunlukla bir listeye toplarsınız: kayitlar = list(csv.DictReader(f)). Çok büyük dosyada bunu yapmak belleği doldurabilir; böyle durumlarda satırları döngüde tek tek işleyin.

CSV dosyası yazmak

Yazma işleminde csv.writer liste, csv.DictWriter sözlük kabul eder:

import csv

kayitlar = [ {"ad": "Ayşe", "sehir": "İzmir"}, {"ad": "Mehmet", "sehir": "Ankara"}, ]

with open("cikti.csv", "w", newline="", encoding="utf-8") as f: yazici = csv.DictWriter(f, fieldnames=["ad", "sehir"]) yazici.writeheader() yazici.writerows(kayitlar)

DictWriter'da fieldnames zorunludur; belgelerde bu, DictReader'dan farklı olarak vurgulanır. writeheader başlık satırını yazar, writerow tek satır, writerows birden çok satır yazar. Sözlükte fieldnames'te olmayan bir anahtar varsa varsayılan olarak hata alırsınız; extrasaction="ignore" ile bu anahtarları yok sayabilirsiniz.

Sayı ve diğer tür değerleri yazıcı otomatik olarak str'ye çevirir; None değeri boş alan olarak yazılır. Tırnak davranışı quoting parametresiyle ayarlanır: varsayılan QUOTE_MINIMAL yalnız özel karakter içeren alanları tırnaklar, QUOTE_ALL her alanı tırnaklar.

Mevcut dosyaya satır eklemek istiyorsanız dosyayı "a" kipinde açın; ancak başlık satırını yeniden yazmamaya dikkat edin. Yazma işleminde de newline="" kullanın; Python belgelerine göre bu belirtilmezse Windows'ta fazladan satır sonu karakteri eklenebilir.

Ayraç ve Türkçe karakter sorunları

Türkçe ortamda iki sorun neredeyse her projede karşınıza çıkar: ayraç ve kodlama. Excel'in Türkçe ayarlarında dosyayı CSV olarak kaydettiğinizde alanlar genellikle noktalı virgülle ayrılır, çünkü virgül ondalık ayracı olarak kullanılır. Python'un varsayılan ayracı virgüldür; belgelere göre delimiter parametresi bunu değiştirir:

okuyucu = csv.reader(f, delimiter=";")

Ayracı yanlış verirseniz tüm satır tek bir alan olarak gelir; bu, sorunun işareti olarak bilinir. Belirsizse dosyanın ilk satırına bakın.

Kodlama sorununda ise ş, ğ, ı gibi harfler bozuk görünür. Sebep, dosyanın başka bir kodlamayla kaydedilmiş olmasıdır. Python belgelerine göre open, kodlama belirtmezseniz varsayılan kodlamayı kullanır; farklı bir kodlama gerekiyorsa encoding parametresiyle verilmelidir. Dosya UTF-8 ise encoding="utf-8" yazın. Eski Windows programlarının dışa aktardığı dosyalarda Türkçe için cp1254 kodlaması gerekebilir. Excel'de açılacak bir dosya yazıyorsanız ve Türkçe karakterler bozuk görünüyorsa, utf-8-sig kodlaması başa bir işaret ekleyerek Excel'in dosyayı UTF-8 olarak tanımasına yardımcı olur.

Hangi kodlamanın doğru olduğunu tahmin etmek yerine, dosyayı üreten sistemin belgesine bakın ya da birkaç kodlamayı deneyip Türkçe karakterlerin doğru çıktığını doğrulayın. Yanlış kodlamayla okuyup yazmak, veriyi kalıcı bozabilir; önce kopya üzerinde deneyin.

Şekil 1

Ayraç ve kodlamayı açıkça belirtmek sorunu önler

Okuma ayarları

Sorunlu okuma
Güvenli okuma
Kodlama belirtilmez
encoding açıkça yazılır
newline verilmez
newline boş verilir
Ayraç tahmin edilir
delimiter dosyaya göre seçilir
Satır elle bölünür
csv.reader ya da DictReader kullanılır
Kaynak: Python belgeleriMindset Institute

Hata durumları ve temizlik

Gerçek dosyalar kusurludur: eksik alanlar, fazladan sütunlar, boş satırlar, bozuk tırnaklar. Okuma döngüsünü bu durumlara hazırlayın. DictReader kullanıyorsanız eksik değerlerde restval, fazla değerlerde restkey devreye girer; bunları kontrol etmeden veri temiz sanılabilir.

Modül, biçim bozukluğu algıladığında csv.Error hatası fırlatır. Belgelerde gösterildiği gibi hatayı yakalayıp reader.line_num ile hangi satırda sorun çıktığını raporlayabilirsiniz; bu, büyük dosyalarda sorunlu satırı bulmayı hızlandırır.

Okunan değerlerin hepsi metindir. Sayısal sütunları kullanmadan önce dönüştürün ve dönüştürme hatasını yakalayın; aksi halde bozuk bir hücre tüm betiği durdurur. Boş hücreler boş metin olarak gelir, None olarak değil. Tarih sütunları da metindir; tarih işlemleri için datetime modülü gerekir.

Başlık adlarındaki boşluklar ve büyük-küçük harf farkları sık hata kaynağıdır. DictReader ile kayit["ad"] yazarken sütunun gerçekten "ad" olduğundan emin olun; dosyanın ilk satırı başında görünmez bir işaret taşıyorsa ilk sütun adı bozuk gelebilir. Bu durum genellikle dosya BOM'lu kaydedildiğinde olur ve utf-8-sig kodlamasıyla okumak sorunu çözer.

Çok büyük ya da karmaşık tablolarla çalışıyorsanız, csv modülü yerine pandas'ın read_csv işlevi daha uygun olabilir; bu işlev tür dönüşümü, eksik değer yönetimi ve filtrelemeyi tek adımda sunar.

Sık yapılan hatalar

İlk hata, dosyayı newline="" olmadan açmaktır; tırnaklı alandaki satır sonları ve yazarken fazladan boş satırlar buradan gelir. İkinci hata, kodlamayı belirtmeyip varsayılana güvenmektir; bu, aynı kodun farklı bilgisayarlarda farklı davranmasına yol açar.

Üçüncü hata, ayracı varsaymaktır. Noktalı virgüllü dosyayı virgül ayracıyla okumak, tek sütunlu bir tablo üretir. Dördüncü hata, satırı split(",") ile elle bölmektir: tırnak içinde virgül içeren bir alanda satır yanlış bölünür.

Beşinci hata, değerlerin metin olduğunu unutmaktır. Metin olarak gelen bir sayı ile gerçek sayı farklıdır; sıralama ve karşılaştırma metinsel yapılır. Altıncı hata, with bloğu kullanmamaktır; dosya kapanmazsa yazılan veri diske tam yazılmayabilir.

Yedinci hata, DictWriter'a fieldnames vermemek ya da sözlükte fazladan anahtar bırakmaktır. Son olarak, yazdığınız dosyayı yeniden okuyarak doğrulayın: özellikle Türkçe karakterlerin ve tırnaklı alanların döngüde bozulmadığını görün.

Bu beceriyi Mindset programlarında nerede çalışırsınız

Python programlama ve veri bilimi programlarındaki dosyalarla çalışma modülleri, CSV gibi biçimlerin okunmasını ve yazılmasını uygulamalı olarak işler. Veri toplama, raporlama ve otomasyon görevlerinde ilk adım çoğu zaman dışarıdan gelen bir CSV dosyasını doğru okumaktır.

İlgili Mindset programı

Data Science Bootcamp

Sık sorulanlar

Sık sorulan sorular

Python'da CSV dosyası nasıl okunur?

Dosyayı with open(dosya, newline="", encoding="utf-8") ile açın ve csv.reader ya da csv.DictReader'a verin. reader her satırı liste, DictReader ilk satırı başlık kabul edip sözlük olarak verir. Okunan tüm değerler metindir, sayısal alanları kendiniz dönüştürmelisiniz.

CSV'deki Türkçe karakterler neden bozuk görünüyor?

Çünkü dosya, Python'un beklediğinden farklı bir kodlamayla kaydedilmiştir. open işlevine doğru encoding verin: dosya UTF-8 ise utf-8, eski Windows çıktısıysa cp1254 gibi bir kodlama gerekebilir. Doğrusunu üreten sistemin belgesinden öğrenin ya da deneyip Türkçe harfleri kontrol edin.

Noktalı virgülle ayrılmış CSV'yi nasıl okurum?

csv.reader ya da DictReader'a delimiter=";" parametresini verin. Türkçe bölge ayarlı Excel çıktılarında ondalık ayracı virgül olduğu için alanlar sıklıkla noktalı virgülle ayrılır. Ayracı yanlış verirseniz satır tek alan olarak okunur.

newline="" neden gerekli?

Python belgelerine göre dosya newline="" ile açılmazsa tırnaklı alanlar içindeki satır sonları doğru yorumlanmayabilir ve bazı platformlarda yazarken fazladan satır sonu karakteri eklenebilir. csv modülü kendi satır sonu işlemesini yaptığı için bu parametreyi her zaman vermek güvenlidir.

csv modülü mü pandas mı kullanmalıyım?

Küçük ve orta boyutlu dosyalarda, ek kütüphane gerekmeyen basit okuma yazma için csv modülü yeterlidir. Büyük tablolarda, tür dönüşümü, eksik değer yönetimi ve filtreleme gerektiğinde pandas'ın read_csv işlevi daha pratiktir.

Python ile CSV Okuma ve Yazma: csv Modülü Rehberi