Python Dosya İşlemleri: Okuma, Yazma ve Güvenli Örnekler

Python ile dosya işlemleri uygulama geliştirmede sık kullanılan temel becerilerdendir. Bu yazıda open() kullanımından başlayarak okuma/yazma yöntemlerini, ikili (binary) dosya işlemlerini, güvenli kullanım önerilerini ve sık karşılaşılan durumlara yönelik pratik örnekleri adım adım ele alacağız.

Örnekler hem yeni başlayanlar hem de günlük geliştirme sırasında hızlı referans ihtiyacı olanlar için hazırlanmıştır. Temel prensipler: hangi modda açtığınız, nasıl kapattığınız (context manager) ve hata yönetimini doğru yapmaktır — bu konular kaynaklarda da vurgulanmaktadır.

Temel kavramlar: open(), dosya nesnesi ve modlar

Python'da dosya açmak için yerleşik open() fonksiyonu kullanılır. Fonksiyon bir dosya nesnesi (file object) döndürür; bu nesne üzerinden okuma/yazma yapılır. En sık kullanılan modlar şunlardır: 'r' (okuma), 'w' (yazma, varsa üzerine yazar), 'a' (ekleme) ve 'b' (ikili/binary). Bu temel bilgilerle ilgili kaynaklar için örnek dokümanlara bakabilirsiniz.

Detaylı mod ve kullanım açıklamaları için rehber örnekleri inceleyebilirsiniz: Cyber War — Python Dosya İşlemleri ve Derslik: Dosya İşlemleri.

Context manager: with open kullanımı (otomatik kapanma)

Dosya ile iş bittikten sonra dosyayı kapatmak önemlidir. Bunun için en güvenli ve tercih edilen yol with (context manager) kullanmaktır; böylece dosya bloğu sona erdiğinde Python dosyayı otomatik kapatır. Bu yaklaşım kaynak sızıntılarını ve açık kalan dosya tanıtıcılarını önlemeye yardımcı olur.

with open('veri.txt', 'r', encoding='utf-8') as f:
text = f.read()

Hemen her durumda with kullanmanız önerilir. Konuyla ilgili üniversite ders notlarında ve rehberlerde de aynı tavsiye bulunur; örneğin Harran Üniversitesi dokümanında context manager kullanımı belirtilmiştir: Harran Üniversitesi — Dosya Okuma Modları.

Dosya okuma yöntemleri: read(), readline(), iterasyon

Dosyadan veri almak için birkaç farklı yöntem vardır; hangi yöntemi seçeceğiniz dosya boyutu ve ihtiyaçlarınıza bağlıdır:

  • f.read(): Tüm içeriği tek bir string olarak döndürür. Küçük dosyalar için uygundur.
  • f.readline(): Bir seferde tek bir satır okur; döngü içinde kullanılarak satır satır işleme yapılabilir.
  • f.readlines(): Tüm satırları bir liste olarak döndürür; hafıza kullanımı yüksek olabilir.
  • En bellek dostu yöntem for line in f ile dosya üzerinde satır satır iterasyondur; Python satırları gerektiği kadar tamponlayarak okur.

Örnek: satır satır okuma

with open('log.txt', 'r', encoding='utf-8') as f:
for line in f:
process(line)

Bu metotlar ve kullanım örnekleri hakkında daha fazla teknik detay ToRbAcİ rehberinde de ele alınmaktadır: ToRbAcİ — Dosya Okuma ve Yazma.

Dosya yazma: write(), writelines(), mod seçimi

Dosyaya yazarken kullanacağınız mod yazma davranışını belirler: 'w' var olan içeriği siler ve yeniden yazar, 'a' ise mevcut içeriğe ekleme yapar. Yazma metotları:

  • f.write(text): Tek bir string yazar.
  • f.writelines(list_of_strings): Bir liste içindeki stringleri sırayla yazar (satır sonlarını kendiniz eklemelisiniz).
  • f.flush() gerektiğinde tamponu diske zorlar (ör. kritik veriler yazılırken).

Örnek: dosyaya satır ekleme

with open('output.txt', 'a', encoding='utf-8') as f:
f.write('Yeni satır\n')

Binary (ikili) dosya işlemleri

Metin dosyalarının dışında görüntü, ses veya ikili formatlı verilerle çalışırken dosyayı 'rb' veya 'wb' modunda açmalısınız. Bu mod byte nesneleriyle (bytes) çalışmayı sağlar; Python string'leri değil, ham veriyi okur/yazar.

with open('resim.png', 'rb') as src:
data = src.read()
with open('kopya.png', 'wb') as dst:
dst.write(data)

Binary mod ile ilgili temel açıklamalar ve örnekler için ders notlarına bakabilirsiniz: Derslik — Dosya İşlemleri.

Hata yönetimi ve güvenli yazma

Dosya işlemlerinde sık karşılaşılan hatalar; dosyanın bulunmaması (FileNotFoundError), izin problemleri (PermissionError) veya disk doluluğu gibi durumlardır. Bu hataları yakalamak için try-except blokları kullanın ve kullanıcıya veya log'a açıklayıcı mesaj bırakın.

try:
with open('veri.txt', 'r', encoding='utf-8') as f:
process(f.read())
except FileNotFoundError:
print('Dosya bulunamadı.')
except PermissionError:
print('Dosyaya erişim reddedildi.')

Try-except ile hata yönetimi başlangıç için yeterlidir; bu konuda üniversite ve rehber kaynakları benzer öneriler sunar: Harran Üniversitesi.

Güvenli yazma için dikkate alınması gerekenler: dosya yollarını doğrulayın, kullanıcı girdilerini doğrudan dosya adlarında kullanmaktan kaçının ve kritik güncellemeler için atomik yazma tekniklerini değerlendirin (örneğin geçici dosyaya yazıp sonra değiş tokuş etmek).

Performans ve bellek ipuçları

Büyük dosyalarla çalışırken hafızayı korumak önemlidir. Bazı pratik öneriler:

  • Dosyayı satır satır işleyin (for line in f) — tüm dosyayı belleğe almak yerine.
  • Büyük binary akışlarda .read(chunk_size) kullanın ve parçalar halinde işleyin.
  • Yazma sırasında gereksiz flush çağrılarından kaçının; yalnızca kritik anlarda flush kullanın.

Hangi yöntemin daha uygun olduğu dosya boyutu ve uygulama gereksinimlerine göre değişir; pratik örnekler için rehber kaynaklara göz atabilirsiniz.

Kontrol listesi: Yaygın senaryolar için hızlı rehber

  • Her zaman with open(...) kullanın; otomatik kapanma sağlar.
  • Küçük dosyalar için read(), büyük dosyalar için satır/çanta (chunk) bazlı okumayı tercih edin.
  • Binary veriler için 'rb'/'wb' kullanın.
  • Hata yönetimi için try-except kullanın ve spesifik istisnaları yakalayın.
  • Dosya yollarını doğrulayın; kullanıcı girdilerini doğrudan dosya adı yapmayın.

Pratik örnek: Satır satır okuyup filtreleyerek yeni dosyaya yazma

with open('giris.txt', 'r', encoding='utf-8') as src, open('cikis.txt', 'w', encoding='utf-8') as dst:
for line in src:
if not line.strip().startswith('#'):
dst.write(line)

Bu küçük örnek yorum satırlarını ("#" ile başlayanları) atarak yeni bir dosya oluşturur. Gerçek uygulamalarda ek hata kontrolü ve yol doğrulama eklemeyi unutmayın.


Kaynaklar ve önerilen okumalar: