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 zamannewline=""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", senint(...)ç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:
(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 zamannewline=""geç. - Dosyanın başlıkları varsa
DictReader/DictWriterkullan — 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ç.