Python ile dosya okuma ve yazma: kısa kod snippetleri
Dosya girdi/çıktısı (I/O) çoğu uygulamada temel bir gereksinimdir: konfigürasyonları okumak, sonuçları kaydetmek veya ikili verileri kopyalamak gibi. Bu yazıda Python'da en sık kullanılan yöntemleri, kısa ve doğrudan kod snippetleriyle gösteriyorum. Temel konular: open(), modlar, with kullanımı ve encoding parametresi. (Kaynak: Python 3 Girdi ve Çıktı — Resmi Belgelendirme.)
Temel open() kullanımı ve modlar
Dosya açmak için Python'da open() fonksiyonu kullanılır. Temel görünüm: open(path, mode='r', encoding=None). Mode (mod) parametresi, dosyayla nasıl etkileşim kurulacağını belirler. Aşağıda sık kullanılan modların kısa özeti bulunur:
- 'r': Okuma (varsayılan). Dosya yoksa hata verir.
- 'w': Yazma — var olan dosyayı siler ve yeniden oluşturur.
- 'a': Ekleme — yazılan veri dosya sonuna eklenir.
- 'x': Yeni dosya oluşturur; dosya zaten varsa hata verir.
- 'r+': Okuma ve yazma (dosya mevcut olmalıdır).
- 'rb', 'wb', 'ab': Binary modları — bytes (ikili veri) ile çalışırken kullanın.
Daha fazla ayrıntı ve ileri seçenekler için resmi belgelendirmeye bakabilirsiniz: https://docs.python.org/tr/3/tutorial/inputoutput.html.
with open ile güvenli dosya işlemleri
with bağlam yöneticisi, dosyanın otomatik olarak kapatılmasını sağlar; istisna oluşsa bile close() çağrılır. Bu, çoğu senaryo için en güvenli ve okunaklı yaklaşımdır.
with open('ornek.txt', 'r', encoding='utf-8') as f:
icerik = f.read()
print(icerik)
Kısa kod snippetleri
Aşağıda günlük görevler için kısa ve doğrudan örnekler bulunur. Her örnek sonrası kısa açıklama yer alır.
Dosyayı tümüyle okumak
with open('dosya.txt', 'r', encoding='utf-8') as f:
text = f.read()
print(text)
read(), dosyanın tamamını bir string olarak döndürür. Küçük-orta boy dosyalar için uygundur; çok büyük dosyalar belleği doldurabilir.
Satır satır okumak
with open('dosya.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.rstrip())
Dosyayı satır satır işlemek için bu yöntem hem okunaklı hem de bellek açısından verimlidir. rstrip() ile satır sonu karakterlerini temizleyebilirsiniz.
Büyük dosyalar için parça parça (chunk) okuma
with open('buyuk_dosya.txt', 'r', encoding='utf-8') as f:
while True:
chunk = f.read(1024) # 1 KB bloklar
if not chunk:
break
# chunk üzerinde işlem yapın
Büyük dosyaları parça parça okuyarak bellek kullanımını sınırlandırabilirsiniz. Boyutu uygulamanıza göre ayarlayın (ör. 4096 veya 8192).
Yazma ve ekleme
with open('yeni.txt', 'w', encoding='utf-8') as f:
f.write('Merhaba Dünya\n')
'w' modu dosyayı sıfırlar (truncate). Var olan veriyi kaybetmemek için dikkat edin.
with open('yeni.txt', 'a', encoding='utf-8') as f:
f.write('Yeni satır\n')
'a' modu ile dosya sonuna ekleme yapılır; mevcut veri korunur.
Okuma ve yazma ('r+')
with open('hesap.txt', 'r+', encoding='utf-8') as f:
data = f.read()
f.seek(0)
f.write('Başlık: Yeni içerik\n')
'r+' ile hem okuma hem yazma yapabilirsiniz. Ancak yazma sırasında dosyanın üzerine yazma (overwrite) gerçekleşebilir; pozisyon (seek) kullanımı önemlidir.
Binary dosya örneği: dosya kopyalama
with open('kaynak.jpg', 'rb') as src:
with open('hedef.jpg', 'wb') as dst:
while True:
chunk = src.read(8192)
if not chunk:
break
dst.write(chunk)
İkili veriler (görüntü, ses, vb.) için 'rb' ve 'wb' modlarını kullanın. Metin kodlaması uygulanmaz; bytes doğrudan okunup yazılır.
JSON ile dosyaya veri yazma
import json
data = {'ad': 'Ayşe', 'yas': 28}
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
JSON verisi yazarken encoding='utf-8' ve ensure_ascii=False kullanmak, Türkçe karakterlerin doğru saklanmasını sağlar.
Hatalardan kaçınma ve en iyi uygulamalar
- Her zaman with kullanın — dosyanın kapatılmasını garanti eder (Python belgelerine göre önerilir).
- Encoding belirtin (ör. 'utf-8') — özellikle platformlar arası taşınabilirlik için önemlidir.
- 'w' modunun dosyayı sileceğini unutmayın; var olan veriyi kaybetmemek için 'a' veya 'x' kullanmayı değerlendirin.
- Binary vs text: bytes ile çalışıyorsanız 'b' ekini kullanın (ör. 'rb', 'wb').
- Büyük dosyalar için chunk okuma ile bellek tüketimini yönetin.
- Eşzamanlı yazma gereken durumlarda dosya kilitleme (file locking) veya başka senkronizasyon yöntemleri düşünün; basit uygulamalar için bunun gerekli olmayabileceğini değerlendirin.
Performans notları
readlines() gibi yöntemler küçük dosyalarda hızlı olsa da, büyük dosyalarda bellek tüketimi yaratabilir. Döngüde satır okuma veya sabit büyüklükte chunk'lar kullanmak genelde daha dengeli sonuç verir. İleri durumlar için hafızaya haritalama (mmap) gibi teknikler değerlendirilebilir.
Örnek: basit dosya kopyalama fonksiyonu
def copy_file(src_path, dst_path):
with open(src_path, 'rb') as src:
with open(dst_path, 'wb') as dst:
while True:
buf = src.read(8192)
if not buf:
break
dst.write(buf)
Bu fonksiyon, hem ikili hem de metin dosyalarını kopyalamak için temel bir örnektir (ikili mod daha güvenlidir, çünkü metin dönüşümleri uygulanmaz).
Sonuç
Python'da dosya işlemleri açık ve anlaşılırdır: open(), uygun mod seçimi ve with kullanımı çoğu ihtiyacı karşılar. Kod örneklerinde gösterildiği gibi, küçük snippet'lerle okuma, yazma, ekleme ve ikili veri işlemleri hızlıca uygulanabilir. Temel kavramları ve parametreleri Python'un resmi belgelendirmesinde bulabilirsiniz: Python Girdi ve Çıktı.