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?

'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ı?

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:
wile 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:
rya dar+ile var olmayan bir dosyayı açmaya çalışırsın.
Kod yazmadan önce kendine şu dört soruyu sor:
- Dosyanın eski içeriği önemli mi?
- Dosya yoksa oluşturulmalı mı?
- Yeni metin sona mı eklenecek, baştan mı yazılacak?
- 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.