İçeriğe geç

Menü

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

Python Dosyası write() Sonrası Neden Okunmaz? seek(0) Mantığı

python-dosyasi-write-sonrasi-neden-okunmaz-seek-0
Bu yazıda neler var?
  1. write() sonrası read() neden boş metin döndürür?
  2. w+ ve r+ modları arasındaki fark nedir?
  3. Çalışan örnek: write(), tell() ve seek(0) adım adım
  4. Boş okuma sorununu üç soruyla teşhis etmek
  5. r+ modunda seek(0) sonrası write() neden üzerine yazar?
  6. Sık Sorulan Sorular

Python'da bir dosyaya write() ile yazdıktan hemen sonra read() çağırdığında boş metin gelir, çünkü yazma işlemi dosya imlecini yazılan metnin sonuna taşır ve read() oradan devam eder. Veri dosyada durur, kaybolmaz; imleç yanlış yerdedir. Çözüm, dosyayı hem okumaya hem yazmaya izin veren bir modda açmak ve okumadan önce seek(0) ile imleci başa almaktır.

write() sonrası read() neden boş metin döndürür?

Bir dosya nesnesi, içinde tek bir konum tutar: dosya imleci. Hem yazma hem okuma her zaman bu konumdan devam eder. İmleci, kitapta kaldığın sayfayı gösteren bir ayraç gibi düşünebilirsin. Kitaba yeni cümleler yazdığında ayraç, yazdığın son cümlenin ardına geçer. Ardından "ayracın olduğu yerden oku" dersen önünde okunacak bir şey bulamazsın.

Python'da olan tam olarak budur. write() metni yazar ve imleç yazılan bölümün sonuna ilerler. Hemen ardından gelen read() da o noktadan başlar, dosyanın sonuna zaten gelinmiştir ve sonuç '' yani boş metin olur. Hata mesajı görmemen bu yüzden şaşırtıcı olabilir: Python burada hatalı bir şey yapmaz, yalnızca imlecin bulunduğu yerden okur.

İmlecin nerede olduğunu görmek için tell() kullanılır. Bu metot, imlecin dosya başından itibaren bulunduğu konumu bir sayı olarak verir. Yazmadan önce, yazdıktan sonra ve okumadan önce tell() değerine bakarsan imlecin nasıl ilerlediğini kendi gözünle izleyebilirsin. Bunu bir sonraki bölümlerde çalışan bir örnekle göreceksin; şimdilik akılda kalacak fikir şu: veri yerinde, imleç yanlış yerde.

w+ ve r+ modları arasındaki fark nedir?

w+ ve r+ modları arasındaki fark nedir?

open() içinde yalnızca 'w' yazarsan dosya sadece yazmak için açılır. Aynı dosya nesnesinden okuma yapmak istiyorsan modun sonuna + eklenir. Bu eklenti "hem yazma hem okuma" anlamına gelir. Ancak + ile biten iki ana mod, dosyaya farklı davranır.

'w+' modu, dosya yoksa onu oluşturur. Dosya varsa içeriğini baştan siler ve boş bir sayfayla başlar. 'r+' modu ise dosyanın önceden var olmasını ister ve içeriği silmez; imleç başlangıçta dosyanın başındadır ve mevcut metin olduğu gibi durur.

Hangisini seçeceğine şu ölçütle karar verebilirsin:

  • Boş bir sayfayla başlamak ve eski içeriği umursamamak istiyorsan 'w+'.
  • Dosyadaki mevcut içerik korunacaksa 'r+'.

Dikkat etmen gereken nokta şu: iki modda da write() sonrası imleç yazılan metnin sonunda kalır. Yani + eklemek okuma iznini verir ama imleci senin yerine başa almaz. Okumadan önce seek(0) yazmak yine sana kalır.

Çalışan örnek: write(), tell() ve seek(0) adım adım

Çalışan örnek: write(), tell() ve seek(0) adım adım

Aşağıdaki kısa kod, imlecin yolculuğunu tek dosyada gösterir. Metin bilerek Türkçe karakter içermeyen ASCII harflerden seçildi; bu örnekte tell() değeri karakter sayısıyla birebir örtüşür.

with open('notlar.txt', 'w+') as f:
    f.write('merhaba dunya')
    print(f.tell())
    print(repr(f.read()))
    f.seek(0)
    print(f.tell())
    print(repr(f.read()))
    print(f.tell())

Beklenen çıktı:

13
''
0
'merhaba dunya'
13

Her satırın nedeni şöyle:

  • 13: 'merhaba dunya' 13 karakterdir. Yazma bitince imleç 13. konumda, yani yazılan metnin hemen sonunda durur.
  • '' (boş metin): read() imlecin bulunduğu yerden okumaya başlar. İmleçten sonra okunacak bir şey olmadığı için boş metin döner. repr() burada boşluğu görünür kılar: iki tırnak işareti, içinde hiçbir şey yok.
  • 0: seek(0) imleci dosyanın başına alır, tell() de bunu doğrular.
  • 'merhaba dunya': İmleç başa döndüğü için read() bütün içeriği getirir.
  • 13: Okuma da imleci ilerletir. Dosya sonuna kadar okunduğu için imleç yine 13. konumdadır.

seek(0), dosya içeriğini silmez; okuma ve yazma imlecini dosyanın başına taşır. Silme işini dosyayı 'w' ya da 'w+' ile açma anı yapar. Sonradan çağırdığın seek(0) yalnızca konum değiştirir.

with bloğu ne yapar?

with bloğu bittiğinde dosya otomatik olarak kapanır ve yazdıkların kalıcı olarak kaydedilir. Ayrıca close() yazmayı unutma riskini ortadan kaldırır. Hata çıksa bile dosya düzgünce kapanır.

Boş okuma sorununu üç soruyla teşhis etmek

read() boş döndüğünde kodu baştan yazmana gerek yok. Şu üç soru çoğu zaman nedeni gösterir:

  1. Dosya hangi modda açıldı? Hem yazıp hem okuyabilmek için 'w+' ya da 'r+' gibi bir mod gerekir. 'w+' açılışta içeriği siler, 'r+' silmez.
  2. İmleç şu an nerede? print(f.tell()) ile bak. Değer dosya uzunluğuna eşitse okunacak bir şey kalmamıştır.
  3. İşlemler hangi sırayla yapıldı? Doğru sıra şudur: önce write(), sonra seek(0), sonra read().

Bu sorular örnek koda şöyle karşılık gelir: open('notlar.txt', 'w+') satırı 1. soruyu yanıtlar. İki print(f.tell()) satırı 2. soruyu yanıtlar; ilki 13, ikincisi 0 gösterir. 3. sorunun cevabı ise satırların dizilişindedir: write(), ardından seek(0) ve en son ikinci read(). İlk read(), seek(0)'dan önce geldiği için boş döner. Bu bir kusur değil, imleç mantığını öğrenirken herkesin karşılaştığı doğal bir adımdır.

Dosya işlemlerinde kendini nerede eksik hissettiğini görmek istersen ücretsiz Python bilgi testini çözebilirsin. Test, dosya işlemleri dahil temel Python konularında hangi başlıkları pekiştirmen gerektiğini gösterir.

r+ modunda seek(0) sonrası write() neden üzerine yazar?

Dosyada daha önce yazılı bir içerik varsa r+ modu bu içeriği silmez. Bu yüzden imleci başa alıp yazdığında yeni karakterler, eskilerin yerine geçer. Şu küçük örnekte dosyanın içeriği abcdef:

f = open('notlar.txt', 'r+')
f.seek(0)
f.write('XY')
f.seek(0)
print(f.read())
f.close()

Beklenen çıktı:

XYcdef

Adımlar şöyle işler: seek(0) imleci başa götürür, write('XY') ilk iki karakterin (a ve b) üzerine yazar ve imleç üçüncü karakterin önünde kalır. İkinci seek(0) okumadan önce imleci yeniden başa alır; read() da dosyanın tamamını döndürür. cdef kısmı yerinde durur, çünkü write() araya ekleme yapmaz. İmlecin bulunduğu yerden başlayarak mevcut karakterlerin yerine geçer.

Araya ekleme yapmak istersen yaygın yol, önce metni okuyup değiştirmek ve sonra dosyaya yeniden yazmaktır.

Dosya işlemlerini kendi hızında, adım adım pekiştirmek istersen ücretsiz Sıfırdan Temel Python video eğitimi iyi bir tekrar kaynağı olabilir.

Sık Sorulan Sorular

seek(0) dosyayı siler mi?

Hayır. seek(0) yalnızca imleci dosyanın başına taşır, içeriğe dokunmaz. İçeriği silen şey, w ve w+ modlarında dosyayı açtığın anda yapılan boşaltmadır.

r+ ile yazınca neden üzerine yazıyor?

write() imlecin bulunduğu konumdan başlayarak karakterleri yazar ve araya yer açmaz. İmleç dosyanın başındaysa baştaki karakterlerin yerine geçer, sondaysa sona ekleme gibi görünür.

Dosya imlecini bir kez kavradığında hem boş okuma hem de beklenmedik üzerine yazma davranışı aynı mantıkla açıklanır: işlem nerede yapılıyorsa, bir sonraki işlem oradan devam eder.

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