İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python Dosyaya Yazarken İçerik Neden Silinir? w ve a Modu Farkı

python-dosyaya-yazarken-icerik-silinir-w-a-modu
Bu yazıda neler var?
  1. w modu dosyayı yazmadan önce neden boşaltır?
  2. Mevcut içeriği korumak için a modu nasıl kullanılır?
  3. with open kullanımı neden daha güvenli, dosyayı kapatmazsan ne olur?
  4. encoding="utf-8" neden yazılmalı?
  5. r+ modu ne yapar, hangi sınırları vardır?
  6. Yanlış mod seçimi neye mal olur, hangi modu seçmelisin?
  7. Sık Sorulan Sorular

Python'da dosyaya yazarken içeriğin silinmesinin nedeni, dosyayı 'w' (write) modunda açmandır. Bu mod dosyayı açtığı anda içini boşaltır; write() çağırmasan bile eski içerik gider. Mevcut satırların kalması ve yenilerin sona eklenmesi için dosyayı 'a' (append) modunda açman gerekir. Aşağıda aynı not dosyası üzerinde iki küçük deney yapıp farkı çıktılarıyla göreceksin.

w modu dosyayı yazmadan önce neden boşaltır?

'w' modunun görevi "bu dosyaya sıfırdan yaz" demektir. Python dosyayı açarken onu kırpar (truncate): dosya varsa içeriği sıfırlanır, yoksa yeni bir boş dosya oluşturulur. Silme işlemi write() satırına gelmeden, open() çağrısı sırasında olur. Yani bu bir hata ya da senin kodundaki bir yanlışlık değil, modun tasarımıdır. Sadece adı yüzünden "ekleme" gibi anlaşılabilir.

Deney 1: aynı dosyaya iki kez w ile yazmak

Beklenen: İlk çalıştırmada dosyada 1. not: değişkenler olmalı. İkinci çalıştırmada metni 2. not: döngüler yapıp aynı kodu tekrar çalıştırdığında dosyada yalnızca bu satır kalmalı, çünkü ikinci açılışta ilk satır silinecek.

İlk çalıştırma:

with open('notlar.txt', 'w', encoding='utf-8') as dosya:
    dosya.write('1. not: değişkenlern')

with open('notlar.txt', 'r', encoding='utf-8') as dosya:
    print(dosya.read(), end='')

Dosyanın gerçek içeriği:

1. not: değişkenler

İkinci çalıştırma için yalnızca yazılan metni değiştiriyoruz:

with open('notlar.txt', 'w', encoding='utf-8') as dosya:
    dosya.write('2. not: döngülern')

with open('notlar.txt', 'r', encoding='utf-8') as dosya:
    print(dosya.read(), end='')

Dosyanın gerçek içeriği:

2. not: döngüler

İlk not gitti. Not dosyan her çalıştırmada sıfırlanıyorsa, büyük ihtimalle bu iki adımın aynısı yaşanıyordur. (encoding parametresine ilerleyen bölümlerde döneceğiz; şimdilik örneklerin hepsinde yazılı olduğunu bil yeter.)

Hiçbir şey yazmasan da dosya boşalır

Silmenin write() ile ilgisi olmadığını şu iki satır gösterir:

with open('notlar.txt', 'w'):
    pass

with open('notlar.txt', 'r') as dosya:
    print(repr(dosya.read()))

Çıktı:

''

pass hiçbir şey yapmaz, yine de dosya boştur. Çıktıdaki '' boş bir metindir. Bu yüzden "yazmadım ki, neden silindi?" sorusunun cevabı, dosyanın 'w' ile açılmış olmasıdır.

Mevcut içeriği korumak için a modu nasıl kullanılır?

Mevcut içeriği korumak için a modu nasıl kullanılır?

'a' (append) modu dosyayı silmez. Konumu dosyanın sonuna koyar ve her write() çağrısı yazdığını o noktaya ekler. Dosya yoksa 'w' gibi onu da oluşturur; fark, var olan bir dosyaya dokunmamasıdır.

Deney 2: mevcut dosyaya satır eklemek

Deney 1'in sonunda dosyada 2. not: döngüler satırı var. Beklenen: bu satır yerinde kalmalı, altına 3. not: fonksiyonlar eklenmeli.

with open('notlar.txt', 'a', encoding='utf-8') as dosya:
    dosya.write('3. not: fonksiyonlarn')

with open('notlar.txt', 'r', encoding='utf-8') as dosya:
    print(dosya.read(), end='')

Dosyanın gerçek içeriği:

2. not: döngüler
3. not: fonksiyonlar

Eski satır korundu. Aynı kodu bir kez daha çalıştırırsan Python bunun "zaten var" olduğunu kontrol etmez; 3. not: fonksiyonlar satırı ikinci kez eklenir. 'a' her çalıştırmada sona ekler, tekrarı engellemek senin işindir.

Satır sonu karakterini unutma

write() otomatik satır atlamaz. Metnin sonuna n koymazsan bir sonraki ekleme aynı satırın devamına yapışır. Örneğin '3. not: fonksiyonlar' yazıp ardından '4. not: listelern' eklersen dosyada 3. not: fonksiyonlar4. not: listeler görürsün. Her satırın sonuna n koymak bu karışıklığı önler.

with open kullanımı neden daha güvenli, dosyayı kapatmazsan ne olur?

with bloğu bittiğinde dosya otomatik kapanır. Blok içinde hata çıksa bile bu böyle olur, çünkü dosya nesnesi bir bağlam yöneticisi (context manager) gibi çalışır. close() çağırmayı hatırlamana gerek kalmaz.

Önce close() unutulmuş klasik yazım:

f = open("not.txt", "a", encoding="utf-8")
f.write("Yeni notn")
# f.close() yazılmadı

Şimdi aynı işin with ile yazılmış hâli:

with open("not.txt", "a", encoding="utf-8") as f:
    f.write("Yeni notn")

print(f.closed)

Beklenen çıktı True olur ve not.txt dosyasının sonunda Yeni not satırı bulunur. Bloğun dışında f değişkeni durur ama dosya artık kapalıdır.

Python yazdığın veriyi çoğu zaman hemen diske göndermez, önce bir tamponda (buffer) biriktirir. Tampon, dosya kapanırken ya da boşaltıldığında diske iner. Dosyayı kapatmazsan verinin diske ne zaman ineceğinin garantisi kalmaz. Program beklenmedik biçimde sonlanırsa son yazdıkların dosyaya ulaşmamış olabilir. Dosya işlemlerinden önceki temelleri, yani değişkenleri, girdi almayı ve temel sözdizimini tazelemek istersen kendi hızında izlenen video eğitimler bunun için bir seçenek olabilir.

Pratik kural basittir: Dosyayı her açtığında with open(...) yaz. Not dosyası gibi küçük denemelerde de aynı alışkanlığı sürdür.

encoding="utf-8" neden yazılmalı?

encoding="utf-8" neden yazılmalı?

open() çağrısında encoding vermezsen kullanılan kodlama ortama göre değişebilir. Python belgelerine göre varsayılan kodlama platforma ve yerel ayara bağlıdır. Bu yüzden ç, ğ, ı, ö, ş, ü gibi Türkçe karakterler bir bilgisayarda doğru, başka bir bilgisayarda bozuk görünebilir.

encoding="utf-8" yazdığında bu belirsizlik ortadan kalkar. Kodun başka bir bilgisayarda da aynı sonucu verme ihtimali artar. Burada yalnızca kodlamadan söz ediyoruz. Dosya yolları gibi başka konuların her işletim sisteminde aynı olacağı anlamına gelmez.

Yazarken ve okurken aynı kodlamayı kullanmak önemlidir:

with open("calisma.txt", "w", encoding="utf-8") as f:
    f.write("Çalışma notu: ğüşiöçn")

with open("calisma.txt", "r", encoding="utf-8") as f:
    print(f.read())

Beklenen çıktı:

Çalışma notu: ğüşiöç

Yazarken utf-8, okurken başka bir kodlama seçersen karakterler bozulabilir ya da okuma sırasında hata alabilirsin. Mod ne olursa olsun, metin dosyalarında encoding="utf-8" yazmayı alışkanlık hâline getir.

r+ modu ne yapar, hangi sınırları vardır?

"r+" modu aynı anda hem okuma hem yazma içindir. "w" gibi dosyayı boşaltmaz, ama "a" gibi sona da eklemez. Dosyayı olduğu gibi açar ve imleci en başa koyar. Yazdığın metin, imlecin bulunduğu yerden başlayarak eski metnin üzerine biner. Dosyanın var olması şarttır, yoksa r+ onu oluşturmaz.

Deney 3: r+ ile üzerine yazma

Deney 2'nin sonunda notlar.txt şu içeriğe sahipti:

2. not: döngüler
3. not: fonksiyonlar

Beklenen içerik: Kod "9. not" yazacak. Bu metin 6 karakter ve eski metnin ilk 6 karakteri olan 2. not ile aynı uzunlukta. Dosyanın geri kalanı yerinde durmalı: 9. not: döngüler ve 3. not: fonksiyonlar.

with open("notlar.txt", "r+", encoding="utf-8") as dosya:
    dosya.write("9. not")

with open("notlar.txt", "r", encoding="utf-8") as dosya:
    print(dosya.read())

Dosyanın gerçek içeriği:

9. not: döngüler
3. not: fonksiyonlar

Yeni metin sona eklenmedi, ilk altı karakterin üzerine bindi. Yeni metin eskisinden kısa olursa da dosya kısalmaz. Örneğin "9" yazsaydın yalnızca ilk karakter değişir, . not: döngüler yerinde kalırdı. Bu yüzden r+, uzunluğunu bildiğin bir kısmı değiştirmek için uygundur. Metni baştan yazmak içinse w daha doğru bir seçimdir.

Benzer dosya hatalarını ve çözümlerini okumak istersen Berk Akademi blog arşivindeki Python yazılarına göz atabilirsin.

İkinci gözlem: olmayan dosyayı r+ ile açmak

with open("olmayan.txt", "r+", encoding="utf-8") as dosya:
    dosya.write("merhaba")

Bu kod dosya oluşturmaz, hata verir:

FileNotFoundError: [Errno 2] No such file or directory: 'olmayan.txt'

Mesajı sağdan sola okuyabilirsin. Sonda Python'un aradığı dosya adı yazar, ortada sorunun "böyle bir dosya ya da klasör yok" olduğu söylenir, başta ise hatanın türü bulunur. Çözüm için dosya adını, yazımını ve programın çalıştığı klasörü kontrol et. Mesajın tam metni işletim sistemine ve Python sürümüne göre biraz farklı görünebilir.

Dosyanın başına yeni bir satır eklemek (araya ekleme) r+ ile doğrudan yapılamaz. Bunun için dosyayı okuyup yeni içerikle birlikte yeniden yazmak gerekir.

Yanlış mod seçimi neye mal olur, hangi modu seçmelisin?

Mod seçimindeki yanlışlar genellikle üç biçimde ortaya çıkar. Hepsi yazım hatası değil, modun ne yaptığını henüz denememiş olmaktan kaynaklanır:

  • Kayıp not: w ile açılan dosya her çalıştırmada sıfırlanır, önceki notlar gider.
  • Yarım üzerine yazma: r+ ile kısa bir metin yazarsan eski içeriğin artığı dosyada kalır ve iki metin iç içe geçmiş gibi görünür.
  • FileNotFoundError: r ya da r+ ile var olmayan bir dosyayı açmaya çalışırsın.

Kod yazmadan önce kendine şu dört soruyu sor:

  1. Dosyanın eski içeriği önemli mi?
  2. Dosya yoksa oluşturulmalı mı?
  3. Yeni metin sona mı eklenecek, baştan mı yazılacak?
  4. Kodlama (encoding="utf-8") belirtildi mi?

Mod seçme kuralı: Eski içerik silinebilir ve her seferinde baştan yazılacaksa w; eski içeriğin sonuna eklenecekse a; var olan dosyanın belirli kısmının üzerine yazılacaksa r+ kullan.

Dosya işlemlerini kendi küçük projelerinde deneyerek pekiştirmek, Python'u kişiye özel müfredatla ve birebir ilerleyerek öğrenmek istersen birebir Python özel ders programı bunun için bir yol olabilir.

Sık Sorulan Sorular

w modunda hiçbir şey yazmazsam dosya yine de silinir mi?

Evet. open("notlar.txt", "w") çağrısı dosyayı açtığı anda içeriği boşaltır. İçeride hiç write() olmasa bile dosya boş kalır.

Dosya yoksa a modu hata verir mi?

Hayır. a modu dosya yoksa yeni bir boş dosya oluşturur, varsa mevcut içeriği koruyup yazdığını sona ekler. Dosya adı bir klasör yolu içeriyorsa ve o klasör yoksa yine FileNotFoundError alabilirsin.

with open kullanmadan close() unutursam yazdıklarım kaybolur mu?

Yazdıkların her zaman kaybolmaz, ama dosyaya ulaştığı garanti değildir. Python yazdığın veriyi önce bellekte biriktirebilir. Program beklenmedik biçimde sonlanırsa ya da aynı dosyayı başka yerden okumaya çalışırsan son yazdıkların görünmeyebilir. with bloğu dosyayı bittiğinde kendiliğinden kapattığı için bu sorunu baştan önler.

Küçük bir not dosyası üzerinde w, a ve r+ modlarını kendin sırayla denemek, farkı okumaktan daha kalıcı biçimde öğretir.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara