Python ile CSV okurken ilk sütun bulunamıyorsa BOM ve ayraç nasıl ayırt edilir?

veinpsyco

Çaylak
Katılım
Eyl 28, 2026
Mesajlar
50
Beğeni
4
Puan
1,281
Konum
istanbul
Meslek
Web Geliştirici · WordPress · SEO · Sunucu Yönetimi
Ürün aktarımında satır["sku"] ifadesi KeyError verirken dosyayı tablo programında açınca ilk başlık düzgün görünebilir. İlk bakılacak yer birinci ürünün değeri değil, CSV okuyucusunun başlıktan oluşturduğu anahtarlardır. Aşağıdaki Python 3 örneği aynı ürünü üç şekilde okuyor. Dosya oluşturmadan çalıştırabilirsiniz.

Python:
import codecs
import csv
import io

veri = codecs.BOM_UTF8 + b"sku;stok\nK-17;8\n"

def ilk_satir(kodlama, ayrac):
    akis = io.StringIO(veri.decode(kodlama), newline="")
    return next(csv.DictReader(akis, delimiter=ayrac))

for kodlama, ayrac in [("utf-8", ";"), ("utf-8-sig", ";"), ("utf-8-sig", ",")]:
    satir = ilk_satir(kodlama, ayrac)
    print(repr(list(satir)), satir.get("sku"))

İlk okumada anahtarlar ['\ufeffsku', 'stok'] olur ve sku araması None döndürür. Başlangıçtaki üç bayt (EF BB BF), utf-8 ile çözülünce ilk başlığın önünde görünmez bir karakter olarak kalır. İkinci okumada utf-8-sig bu imzayı atlar; anahtarlar ['sku', 'stok'], ürün kodu da K-17 olur.

Üçüncü okumada kodlama yine doğru, ancak virgül seçilmiştir. Anahtar listesi bu kez ['sku;stok'] olur. İki başlığın tek anahtar halinde gelmesi, bu örnekte ayracın yanlış seçildiğini gösterir.

Kendi dosyanızda sadece başlığı incelemek için şu iki bilgiyi dosyanıza uyarlayın: dosya yolu ve ayraç. Bu kontrol kaynak dosyaya yazmaz.

Python:
with open("urunler.csv", encoding="utf-8-sig", newline="") as dosya:
    okuyucu = csv.DictReader(dosya, delimiter=";")
    print(repr(okuyucu.fieldnames))

Dosya BOM'suz UTF-8 ise utf-8-sig ile ilk harf korunur. Dosya farklı bir kodlamadaysa bu ayar onu UTF-8'e dönüştürmez. Örneğin başlıklar doğru görünüp ürün adlarında çözme hatası alıyorsanız dışa aktarırken hangi kodlamanın seçildiğini ayrıca kontrol edin.
 
İlk bakılacak yer birinci ürünün değeri değil, CSV okuyucusunun başlıktan oluşturduğu anahtarlardır.
Ayraç tarafı için bir de standart kütüphanede csv.Sniffer var. Dosyanın ilk birkaç satırını verip sniff(ornek, delimiters=";,") deyince ayracı kendisi buluyor, farklı yerlerden gelen CSV'lerde elle denemekten daha rahat.
 
Sniffer güzel hatırlatma. Sadece tek sütunlu ya da çok kısa örnekte bazen yanlış ayraç seçiyor, o yüzden try ile sarıp hata verirse varsayılan olarak noktalı virgüle düşmek işimi görüyor. Excel çıktılarında da çoğunlukla zaten ; geliyor.
 
Geri
Üst