Python ile Dosya Okuma/Yazma: CSV, JSON ve Binary Örnekleri
Dosya işlemleri, birçok Python uygulamasının temelidir. Bu rehberde metin dosyaları, CSV, JSON ve ikili (binary) dosyalarla nasıl çalışacağınızı; encoding, pathlib kullanımı ve basit hata yönetimi yaklaşımlarını uygulamalı örneklerle öğreneceksiniz. Temel bilgiler Python'un standart kütüphanesindeki araçlara dayanır; CSV ve JSON için ilgili modüller özellikle işe yarar (GeeksforGeeks, Programiz).
Temel kavramlar: open(), modlar ve encoding
Dosyaları açarken en sık kullanılan parametreler şunlardır: mod (ör. 'r','w','a','rb','wb'), encoding (ör. 'utf-8') ve Windows'ta CSV ile ilgili newline davranışını kontrol eden newline="" ayarı. Ayrıca dosyaları daima with bağlam yöneticisi içinde açmak kaynak sızıntılarını önler.
Basit örnek — metin dosyası okuma
with open('example.txt', 'r', encoding='utf-8') as f:
text = f.read()
print(text)
Yazma örneği:
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Merhaba dünya\n')
Pathlib ile dosya yolu yönetimi
Dosya yollarını elle birleştirmek yerine pathlib.Path kullanmak daha güvenlidir ve kod daha taşınabilir olur. Path nesneleri, read_text ve write_text gibi yardımcı metotlar sağlar.
from pathlib import Path
p = Path('data') / 'girdi.txt'
text = p.read_text(encoding='utf-8')
p.write_text('Yeni içerik', encoding='utf-8')
Pathlib hakkında pratik ipuçları için kaynaklarda ek örnekler bulabilirsiniz (ToRbAcİ).
CSV dosyaları: csv modülü ile okuma ve yazma
CSV verileri tablo benzeri yapıdadır; Python'un csv modülü hem satır/sütun bazlı okuma hem de sözlük tabanlı yazma/okuma imkânı verir. Windows'ta yazım yaparken boş satırlar olmaması için newline="" kullanın.
CSV yazma (DictWriter)
import csv
data = [{'ad': 'Ayşe', 'yas': 28}, {'ad': 'Mehmet', 'yas': 34}]
with open('kisiler.csv', 'w', newline='', encoding='utf-8') as f:
fieldnames = ['ad', 'yas']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for row in data:
writer.writerow(row)
CSV okuma (DictReader)
import csv
with open('kisiler.csv', 'r', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['ad'], row['yas'])
Daha ayrıntılı CSV örnekleri ve köşe durumları için bakınız: SitePoint CSV rehberi.
JSON dosyaları: json modülüyle veri serileştirme
JSON, Python sözlükleri ve listeleriyle doğal olarak uyumludur. Türkçe karakterleri korumak için json.dump çağrısında ensure_ascii=False kullanın.
JSON yazma
import json
data = {'isim': 'Özgür', 'roller': ['admin', 'kullanici']}
with open('veri.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
JSON okuma
import json
with open('veri.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data['isim'])
JSON ile ilgili giriş ve örnekler için Programiz'in rehberi faydalıdır (Programiz JSON).
Binary (ikili) dosyalar: ne zaman ve nasıl?
Binary mod ('rb'/'wb') görüntü, audio, sıkıştırılmış dosyalar veya ham byte verisi gerektiğinde kullanılır. Binary dosyaları text olarak açmak veri bozulmasına yol açar; bu yüzden doğru modu seçmek önemlidir.
Dosya kopyalama örneği (chunk ile)
with open('kaynak.jpg', 'rb') as src:
with open('hedef.jpg', 'wb') as dst:
for chunk in iter(lambda: src.read(8192), b''):
dst.write(chunk)
Bu yaklaşım büyük dosyaları bellek tüketimini azaltarak işlemeye imkan verir. Ayrıca byte verisini metinden dönüştürmek için encode/decode kullanılabilir:
text = 'Merhaba' # str
b = text.encode('utf-8') # bytes
with open('metin.bin', 'wb') as f:
f.write(b)
Hata yönetimi ve iyi uygulamalar
- with kullanarak dosyaları otomatik kapatın.
- Okuma/yazma sırasında encoding='utf-8' belirtin; özellikle Türkçe karakterler için önemlidir (ToRbAcİ).
- CSV yazımında newline="" kullanın; aksi halde Windows'ta boş satırlar oluşabilir.
- Harici verileri işlerken istisnaları yakalayın ve kullanıcıya açıklayıcı hata mesajı verin.
- Büyük dosyalar için belleğe tamamını yüklemek yerine chunk/iterasyon kullanın.
Basit hata yakalama örneği
try:
with open('veri.json', 'r', encoding='utf-8') as f:
data = json.load(f)
except FileNotFoundError:
print('Dosya bulunamadı')
except json.JSONDecodeError as e:
print('Geçersiz JSON:', e)
Örnek: CSV'den JSON'a dönüşüm
Bu kısa örnek CSV içeriğini okuyup JSON dosyası üretir.
import csv, json
rows = []
with open('kisiler.csv', 'r', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for r in reader:
rows.append(r)
with open('kisiler.json', 'w', encoding='utf-8') as f:
json.dump(rows, f, ensure_ascii=False, indent=2)
Büyük dosyalar ve performans önerileri
- Chunk okumayı tercih edin (örn. 8 KB veya 64 KB). Büyük buffer’ı kullanmadan önce bellek sınırlarını test edin.
- Disk I/O sınırlarını test edin; çok sayıda küçük yazma işlemi yerine tamponlayıp tek defada yazmak daha verimli olabilir.
- Gerekirse gzip veya benzeri sıkıştırma kullanarak disk kullanımını azaltabilirsiniz; fakat bu ek işlem maliyeti getirir.
Hızlı kontrol listesi (Checklist)
- Dosya modunu doğru seçin: 'r'/'w' (text) vs 'rb'/'wb' (binary).
- Türkçe için encoding='utf-8' kullanın.
- CSV yazımında newline='' kullanın.
- with bağlam yöneticisi ile dosyaları açın.
- Büyük dosyaları chunklarla işleyin.
- Harici veriyi işlerken try-except ile hata mesajı verin.
Kaynaklar ve ileri okuma
- Saving Text, JSON and CSV to a File in Python — GeeksforGeeks
- Python JSON: Read, Write, Parse JSON — Programiz
- Working With CSV Files Using Python — SitePoint
- Python ile Dosya Okuma ve Yazma — ToRbAcİ
Sıkça Sorulan Sorular
1) Dosya açarken encoding parametresi neden gerekli?
Varsayılan encoding sistemden sisteme değişebilir; Türkçe karakterlerin doğru şekilde okunup yazılması için encoding='utf-8' belirtmek en güvenilir yaklaşımdır.
2) CSV yazarken neden newline='' kullanmalıyım?
Python'un csv modülü, platform bağımsız davranmak için newline parametresine ihtiyaç duyar. Windows'ta boş satırlar oluşmasını önlemek için yazarken newline="" kullanılması önerilir (SitePoint).
3) Binary mod ne zaman kullanılır?
Metin olmayan dosyalar (görseller, ses, sıkıştırılmış dosyalar) veya ham byte işlemleri gerektiğinde 'rb' ve 'wb' modları kullanılmalıdır. Metin modunda okuma/yazma verinin bozulmasına yol açabilir.
4) Pathlib kullanmak zorunlu mu?
Zorunlu değil, ancak pathlib dosya yollarını platformlar arası güvenli ve okunaklı bir biçimde yönetir; çoğu senaryoda kolaylık sağlar.
5) Çok büyük JSON dosyalarını nasıl işlerim?
JSON tümüyle belleğe yükleniyorsa bellek sınırlarını zorlayabilir. Satır tabanlı JSON (JSON Lines) veya dosyayı parça parça okuyup işlemeyi tercih etmek gerekir.