with open(...) as f: — dosyalarla çalışmanın standart yoludur, bağlam yöneticisi üzerinden. Bu yöntemle, Python blok with'ten çıkıldığında dosyanın otomatik olarak kapatılmasını garanti eder, hatta bir istisna oluşsa bile. Bu, dosya tanımlayıcılarının sızmalarını ve dosya kilitlenmelerini önler.
Blok içinde dosyayla f.read(), f.write() gibi nesne yöntemlerini kullanarak çalışabilirsiniz. Bloktan çıktığınızda (hata olsa bile) f.close() metodu çağrılır.
Örnek:
with open('data.txt', 'w') as f: f.write('Merhaba!') # Burada dosya kapatılmıştır
Sıkça sorulan soru:
openüzerinden açılan bir dosyanın, blokwith'ten çıkıldıktan hemen sonra kapanacağından emin olabilir miyim, hatta blok içinde bir istisna oluşursa?
Cevap: Evet, işte bu, bağlam yöneticisinin sözleşmesinin garantisidir: istisnalara bakılmaksızın, bloktan çıkıldığında __exit__ metodu çağrılır ve bu da dosyanın kapanmasına yol açar. Bu, f.close() çağrısına kıyasla en büyük avantajdır.
Hikaye
Büyük bir projede, log kayıtları open('log.txt', 'a') ile yapılıyordu ve f.write() açıkça çağrılıyordu, ancak f.close() unutuluyordu. Uygulama uzun süre çalıştıktan sonra işletim sisteminin tüm dosya tanımlayıcılarını tüketti, servis çalışmayı durdurdu.
Hikaye
İzleme sisteminde dosyalar sürekli açık tutuluyordu open kullanılarak, istisnalar işlenmiyordu. Hata oluştuğunda dosya açık kalıyordu, bu da başka bir süreçten tekrar açma girişiminde kilitlenmelere yol açıyordu.
Hikaye
Geliştirici büyük bir dosyayı open ile okuma işlemi gerçekleştirdi ve fonksiyonun ortasında hemen return yaptı, dosyayı kapatmadan. Sonuç olarak, böyle birkaç işlem dosya kaynaklarının dolmasına yol açtı ve işletim sistemi yeni açma işlemlerini engellemeye başladı.