Dosya sistemi ile çalışmak, Python'da programlamanın en temel görevlerinden biridir. Tarihsel olarak, Python dosyalarla çalışmak için basit ve sezgisel bir sözdizimi sunar, bu da onu otomasyon, veri işleme ve web geliştirme görevleri için popüler bir dil haline getirmiştir.
Python'un erken sürümlerinde geliştiriciler dosya sistemine open() yerleşik fonksiyonu ile erişim sağlamaktaydılar. Python 2.5 sürümü ile birlikte, kaynaklarla güvenli bir şekilde çalışmayı sağlayan bağlam yöneticisi protokolü eklenmiştir. Bu, dosyalarla çalışırken kaynak sızıntılarını ve hataları azaltmıştır.
Eğer dosyalarla çalışırken dikkatli bir yaklaşım benimsenmezse:
Modern ve doğru dosya işlemleri, Python'da bağlam yöneticisi olan with open() yapısını kullanır:
with open('data.txt', 'r', encoding='utf-8') as file: data = file.read()
Bu, bir hata oluşsa bile dosyanın otomatik olarak kapanmasını garanti eder. Yazma için 'w' modu, ekleme için 'a', ikili verilerle çalışmak için 'rb', 'wb' vb. kullanılmaktadır. Büyük dosyaların satır satır okunması için yine iterasyon önerilir:
with open('big_data.txt', 'r', encoding='utf-8') as file: for line in file: process(line)
Anahtar özellikler:
'r', 'w', 'a', 'b', '+').read() yerine.Dosya açarken neden bağlam yöneticisi (with) kullanmalıyız, eğer file.close() çağrılabilir?
Cevap: Bağlam yöneticisi, bir istisna oluştuğunda bile dosyanın kapanmasını garanti eder. Manuel olarak close() çağırmak, özellikle karmaşık mantık veya hata blokları ile çalışırken sıklıkla unutulmakta ve kaynak sızıntılarına neden olmaktadır.
Kod örneği:
try: file = open('data.txt', 'r') data = file.read() finally: file.close()
Bu yaklaşım, with open() kullanmaktan daha hantal durumdadır.
**Sadece 'r' modunda açılan bir dosyaya veri yazmak mümkün mü?**
Cevap: Hayır, dosya 'r' modunda açıldığında yazma işlemi mümkün değildir — yazma yöntemlerinin (`write`, `writelines`) çağrılması `io.UnsupportedOperation` istisnasını tetikler. Yazma için 'w', 'a' veya 'r+' modlarını kullanın.
**'r' modunda mevcut olmayan bir dosya açıldığında ne olur?**
Cevap: `FileNotFoundError` istisnası meydana gelir. Yeni bir dosya oluşturmak için 'w' modunu (dosya yoksa oluşturulacak), ya da 'a' (ekleme) modunu veya istisna ile başa çıkmayı kullanın.
# Tipik Hatalar ve Anti-örnekler
- Açılan dosyaların açıkça kapatılmadan bırakılması (`file = open(...); ...; file.close()`).
- Unicode veriler ile çalışırken kodlamanın belirtilmemesi.
- Büyük dosyaların tamamını okumak için (`read()`), bu da belleğin tamamını tüketir.
# Gerçek Hayat Örneği
## Olumsuz Durum
Geliştirici, bağlam yöneticisi olmadan birkaç dosya açar ve birini kapatmayı unutur, bu da sunucuda "Çok fazla açık dosya" hatasına yol açar.
**Artıları:**
- Hızlı gerçekleştirme, daha az kod.
**Eksileri:**
- Tanımlayıcı sızıntıları, uygulamada çökme.
- Potansiyel veri kaybı.
## Olumlu Durum
Her dosya için `with open()` kullanarak, kodlamayı açıkça belirterek ve büyük dosyaları satır satır işleyerek çalışmak.
**Artıları:**
- Güvenilirlik, otomatik kaynak serbest bırakma.
- Okuması kolay, güvenli sürdürülebilirlik.
**Eksileri:**
- Başlangıçta biraz daha fazla disiplin ve sözdizimi bilgisi gerektirir.