Menu

Python CSV: csv Modülü ile CSV Dosyalarını Okuma ve Yazma

Python'da CSV dosyalarını nasıl okur ve yazarsın — csv modülü, DictReader ve DictWriter, başlıkları ve tırnaklamayı yönetmek, ne zaman pandas'a uzanmak lazım.

CSV Göründüğünden Daha Basit (ve Sandığından Daha Tuzaklı)

CSV dosyası sadece metindir: satırlar yeni satırla, alanlar virgülle ayrılır. Fikir bu kadar. Ancak pratikte virgül içeren tırnaklı string'lerle, gömülü satır sonları olan alanlarla, farklı bölgesel alışkanlıklarla (virgüle karşı noktalı virgül), Excel'den kaydedilip BOM içeren dosyalarla karşılaşırsın — kendi line.split(",") yazmanın neredeyse her zaman bir hata olduğu kadar çok uç durum var.

Python'un yerleşik csv modülü hepsini halleder. Küçük ve orta boy dosyalar için başka bir şeye nadiren ihtiyacın olur.

csv.reader ile CSV Okumak

csv.reader, her satırı string listesi olarak verir:

import csv

with open("people.csv", newline="") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Hemen belli olmayan birkaç ayrıntı:

  • open'a her zaman newline="" geç. csv modülü satır sonlarını kendisi yönetir; bu olmadan Windows'ta fazladan boş satırlar alırsın.
  • Her değer bir string'dir. "42", sen int(...) çağırana kadar string olarak kalır. CSV'nin türü yoktur.
  • Başlık satırı da sadece başka bir satırdır. Dosyanda başlık varsa ya ilk satırı manuel atla ya da DictReader'a geç.

Başlık satırını atlamak

import csv

with open("people.csv", newline="") as f:
    reader = csv.reader(f)
    headers = next(reader)         # pulls the first row out
    for row in reader:
        print(row)

next(reader) iteratörü bir adım ilerletir ve o satırı döndürür.

DictReader ile Dict Olarak Okumak

csv.DictReader, ilk satırı başlık olarak kabul eder ve sonraki her satırı dict olarak verir:

import csv

with open("people.csv", newline="") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["name"], row["email"])

İstediğin neredeyse her zaman budur. Sütun isimleri kendini belgeler ve kaynak dosyada sütunları yeniden sıralamak kodunu bozmaz.

Dosyada başlık yoksa, fieldnames=["name", "email", ...] ile açıkça ver.

csv.writer ile CSV Yazmak

csv.writer, satırları (listeleri) CSV satırlarına çevirir:

import csv

rows = [
    ["name", "age", "city"],
    ["Rosa", 30, "Lisbon"],
    ["Ada", 36, "London"],
]

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(rows)

writerow(row) tek satır yazar; writerows(rows) bir iterable'ı tek seferde yazar. Her ikisi de virgül, tırnak ya da satır sonu içeren alanları otomatik tırnaklar — düşünmene gerek yok.

DictWriter ile Dict Yazmak

Verin zaten dict formundaysa, DictWriter "listeye çevir" adımını atlar:

import csv

people = [
    {"name": "Rosa", "age": 30, "city": "Lisbon"},
    {"name": "Ada", "age": 36, "city": "London"},
]

with open("out.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "age", "city"])
    writer.writeheader()
    writer.writerows(people)

fieldnames argümanı hem başlığı hem sütun sırasını kontrol eder. Dict'lerinde fieldnames'te olmayan anahtarlar sessizce atılır (ya da extrasaction="raise" ile hata fırlatabilirsin).

Farklı Sınırlayıcılar ve Tırnaklama

Her "CSV" virgül kullanmaz. Avrupa yerelleştirmeleri genelde ;, tab ayrılmış dosyalar \t, bazı sistemler | kullanır. Bir delimiter= argümanı geç:

import csv

with open("data.tsv", newline="") as f:
    reader = csv.reader(f, delimiter="\t")
    for row in reader:
        print(row)

Alışılmadık tırnaklama kuralları olan dosyalar için csv.register_dialect(...) bir kez yapılandırıp tekrar kullanmana olanak sağlar. Çoğu dosya için varsayılanlar artı delimiter= yeter.

Encoding

CSV dosyaları metindir — encoding'leri vardır. UTF-8 modern varsayılandır; Windows'ta Excel'den gelen dosyalar bazen cp1252 kullanır ya da UTF-8 BOM içerir. Açık ol:

with open("data.csv", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    ...

UnicodeDecodeError görürsen, dosya tahmin ettiğin encoding'de değildir. utf-8-sig (Excel BOM'unu halleder), cp1252 ya da latin-1 yaygın şüphelilerdir.

CSV Satırlarını Kullanışlı Tiplere Çevirmek

Her değer string olarak geldiği için, ayrıştırma sana kalmıştır:

main.py
Output
Click Run to see the output here.

(StringIO, örneği gerçek bir dosya olmadan çalıştırmamıza izin verir — gerçek kodda open(path) yazardın.)

Tuzaklı tipleri olan CSV'ler için (tarihler, null olabilen sayılar, on farklı şekilde yazılan true/false), pandas'ı düşün — çoğu için yerleşik kuralları var.

pandas'a Ne Zaman Uzanmalı

pandas.read_csv(path) bir DataFrame döndürür — bu da şunları yapmak istediğin anda doğru yapıdır:

  • Satır filtrelemek: df[df["active"] == True]
  • Toplulaştırmak: df.groupby("city")["age"].mean()
  • Başka bir tabloyla birleştirmek
  • Basit biçimlendirmeyle geri yazmak
import pandas as pd

df = pd.read_csv("people.csv")
adults = df[df["age"] >= 18]
adults.to_csv("adults.csv", index=False)

Pandas, küçük ve doğrusal okumalar için abartılıdır — ayrıca ağır bir bağımlılıktır (sanal ortamda pip-install et). Ama veri şeklindeki her şey için, Python analistlerinin çoğunun başvurduğu araçtır.

Çok Büyük Dosyaları Akış Olarak İşlemek

csv.reader zaten tembeldir — her seferinde bir satır okur. Baştan list(reader) çağırmak yerine üzerinde gezerek bunu koru; belleğin dosya boyutundan bağımsız olarak sabit kalır:

import csv

with open("huge.csv", newline="") as f:
    reader = csv.DictReader(f)
    error_count = 0
    for row in reader:
        if row["status"] == "error":
            error_count += 1

print(f"Found {error_count} errors.")

Bu, satırları bir listede biriktirmediğin sürece 10 GB'lik bir dosyayı da 10 KB'lik bir dosyayı da aynı keyifle işler.

Birkaç Alışkanlık

  • CSV okurken ya da yazarken open'a her zaman newline="" geç.
  • Dosyanın başlıkları varsa DictReader/DictWriter kullan — tamsayı indeksten daha okunaklı.
  • Encoding konusunda açık ol, özellikle Excel'den ya da İngilizce dışı kaynaklardan gelen dosyalarda.
  • Aşağı akış kodu zorlanmasın diye, tipleri okuma adımında hemen dönüştür.
  • Veriyi sadece taşımakla kalmayıp analiz etmek istediğinde pandas'a geç.

Sırada

Artık JSON ve CSV okuyabiliyorsun. Değineceğimiz son gerçek dünya becerisi, ağ üzerinden veri çekmek — bir sonraki doküman, requests kütüphanesi ile HTTP istekleri hakkında.

Sıkça Sorulan Sorular

Python'da bir CSV dosyasını nasıl okurum?

Yerleşik csv modülünü kullan. csv.reader her satırı string'lerden oluşan bir liste olarak verir; csv.DictReader ise ilk satırı başlık olarak alır ve her satırı dict olarak döndürür. Dosyayı newline='' ile aç ki Python satır sonlarını bozmasın: with open('data.csv', newline='') as f:.

Python'da bir CSV dosyasını nasıl yazarım?

csv.writer'ı yazma modunda ve newline='' ile açılmış bir dosyayla eşleştir. Her satır için writer.writerow([...]), toplu iş için writer.writerows([[...], [...]]) çağır. Dict tabanlı veri için csv.DictWriter kullan — başlıkları otomatik yönetir.

csv modülünü mü yoksa pandas'ı mı kullanmalıyım?

Hızlı okumalar, satır satır işlediğin dosyalar ve fazladan bir bağımlılık istemediğin durumlar için csv kullan. Filtreleme, gruplama ya da birleştirme gerektiğinde — ya da dosya vektörize işlemlerin fark yaratacağı kadar büyükse — pandas'ı tercih et. İkisi de aynı dosyaları açar; seçim, yükleme sonrasında veriyle ne yapacağınla ilgili.

Windows'ta CSV'min satırları arasında neden boş satırlar var?

Dosyayı newline='' olmadan açmışsın. csv modülü kendi satır sonlandırıcılarını yazar; bu argüman olmadan Python, Windows'ta fazladan satır sonu ekler. CSV dosyalarını hem okurken hem yazarken hep open(path, newline='') ile aç.

Coddy ile kodlamayı öğren

BAŞLA