Bir cümlelik özet
Bir metin dosyasına yazmayı ve o dosyayı geri okumayı öğreniyoruz; böylece program kapansa bile verilerimiz kaybolmaz.
Neden önemli?
Şimdiye kadar yazdığın programlar çalışıp bittiğinde her şeyi unuturdu. Bir sayı girdin, ekrana bir şey yazıldı ve program kapandı. Ertesi gün aynı programı açtığında hiçbir şey hatırlamıyordu.
Gerçek uygulamalar böyle çalışmaz. Bir oyun en yüksek skorunu, bir uygulama senin ayarlarını, bir robot ise topladığı ölçümleri saklamak ister. Bunu yapmanın en basit yolu, veriyi bir dosyaya yazmaktır.
Dosya, bilgisayarın diskinde saklanan ve isimlendirilmiş bir bilgi kutusudur. Program kapansa bile dosya diskte kalır. Bu derste .txt uzantılı düz metin dosyalarıyla çalışacağız; çünkü bunlar okunması ve anlaşılması en kolay dosyalardır.
Kısa tanım: Dosya, program kapansa bile diskte kalan, isimlendirilmiş bir bilgi saklama alanıdır.
Dosyaya yazmak ve dosyadan okumak
with open(...) kalıbı
Bir dosyayla çalışmak için önce onu açarız. Python'da bunun güvenli yolu with open(...) as f kalıbıdır.
with open("notlar.txt", "w") as f:
f.write("Bugün Python öğreniyorum\n")
Bu üç satırı parça parça okuyalım:
open("notlar.txt", "w")adındanotlar.txtolan bir dosyayı açar."w"kip (mod) demektir."w"= write, yani yazma. Dosya yoksa oluşturulur.as façılan dosyayafadını verir; artık onafdiye sesleniriz.withbloğu bittiğinde dosya kendiliğinden kapanır. Bunu unutma diye Python bizim yerimize hallediyor.
with satırının altındaki kod içeride kalması için 4 boşluk girintili yazılır. Girinti, o satırların with bloğuna ait olduğunu gösterir.
Metnin sonundaki \n bir satır sonu karakteridir. Yeni bir satıra geçmek için kullanılır; kâğıttaki "enter" tuşu gibi düşünebilirsin.
Dosyayı geri okumak
Yazdığımız dosyayı okumak için kipi "r" (read, okuma) yaparız.
with open("notlar.txt", "r") as f:
icerik = f.read()
print(icerik)
f.read() dosyanın tüm içeriğini tek bir metin olarak verir. Bunu icerik değişkenine koyduk ve ekrana yazdırdık. Terminalde şunu görürüz:
Bugün Python öğreniyorum
Dikkat: Okuma yaparken dosya diskte var olmalıdır. Olmayan bir dosyayı "r" kipiyle açmaya çalışırsan FileNotFoundError hatası alırsın. Bu tanıdık geldiyse iyi; önceki derste hata mesajlarını okumayı çalışmıştık.
Kipleri karıştırmayalım
Üç temel kip vardır:
| Kip | Anlamı | Ne yapar |
|---|---|---|
"r" | read | Dosyayı okur (yazamaz) |
"w" | write | Sıfırdan yazar, eski içeriği siler |
"a" | append | Sonuna ekler, eskiyi korur |
"w" kipinin eski içeriği sildiğini unutma. Var olan bir dosyaya yeni satır eklemek istiyorsan "a" kipini kullanmalısın.
Satır satır çalışmak
Birden çok satır yazmak
Çoğu zaman tek bir cümle değil, bir liste kaydetmek isteriz. Her maddeyi kendi satırına yazalım.
notlar = ["Süt al", "Kitabı geri ver", "Ödevi bitir"]
with open("notlar.txt", "w") as f:
for madde in notlar:
f.write(madde + "\n")
Burada for döngüsü listedeki her maddeyi tek tek gezer. madde + "\n" her maddenin sonuna bir satır sonu ekler; böylece maddeler alt alta yazılır. Dosyanın içi şöyle olur:
Süt al
Kitabı geri ver
Ödevi bitir
Satırları tek tek okumak
Bir dosyayı for döngüsüyle satır satır da okuyabiliriz. Bu, çok büyük dosyalarda bile hafızayı yormaz.
with open("notlar.txt", "r") as f:
for satir in f:
print("- " + satir.strip())
Buradaki satir.strip() küçük ama önemli bir ayrıntıdır. Her satırın sonundaki görünmez \n karakterini temizler; yoksa ekranda maddelerin arasında fazladan boş satırlar oluşur. Çıktı:
- Süt al
- Kitabı geri ver
- Ödevi bitir
Sonuna yeni madde eklemek
Programı yeniden çalıştırdığında "w" her şeyi silerdi. Eski notları koruyup yenisini eklemek için "a" kipini kullanırız.
with open("notlar.txt", "a") as f:
f.write("Suları çiçeklere ver\n")
Bu kod dosyayı silmez; sadece en alta bir satır daha ekler. Şimdi dosyada dört madde vardır.
Mini uygulama
Küçük bir "not defteri" programı yazacağız: kullanıcıdan üç not alacak, bunları bir dosyaya yazacak ve sonra numaralandırarak geri okuyacak.
notlar = []
for i in range(3):
yeni = input(f"{i + 1}. notu yaz: ")
notlar.append(yeni)
with open("defter.txt", "w") as f:
for madde in notlar:
f.write(madde + "\n")
print("\nDefterin içeriği:")
with open("defter.txt", "r") as f:
numara = 1
for satir in f:
print(str(numara) + ". " + satir.strip())
numara = numara + 1
Ne olduğunu izleyelim:
- Boş bir
notlarlistesi açtık. for i in range(3)döngüsü kullanıcıdan üç kez not istedi ve listeye ekledi.- Listeyi satır satır
defter.txtdosyasına yazdık. - Aynı dosyayı geri açıp her satırı numarayla ekrana bastık.
Programı çalıştır. Sonra kapat ve yeniden çalıştırmadan proje klasöründeki defter.txt dosyasını bir metin editörüyle aç. Yazdıkların orada duruyor mu? Duruyorsa, verini başarıyla kalıcı hâle getirdin demektir.
Uygulama laboratuvarı: Dosyalarla Çalışmaya Giriş
Dosyalarla Çalışmaya Giriş konusunu kalıcı hâle getirmenin en iyi yolu, kavramı küçük ve ölçülebilir bir göreve dönüştürmektir. Bu çalışmada Dosyaya yazmak ve dosyadan okumak ile Dosyayı geri okumak arasındaki ilişkiyi kullanarak çalışan kısa bir Python 3 programı, örnek girdiler ve beklenen çıktılar hazırlayacaksın. Amaç yalnız sonucun çalışması değil; hangi kararı neden verdiğini, neyi test ettiğini ve hangi durumda tasarımı değiştireceğini açıklayabilmektir.
Görev senaryosu
Şu senaryoyu ele al: bir dosyadaki satırları okuyup basit özet çıkaran araç. Dersin ana hedefi “with open ile metin dosyalarını güvenle okuyup yazmayı öğren” olduğuna göre önce problemi tek cümleyle tanımla. Ardından sistemin alacağı girdiyi, uygulayacağı işlemi ve üreteceği çıktıyı ayrı ayrı yaz. Bilmediğin bir ayrıntı varsa onu varsayım olarak işaretle; varsayımı gerçek bilgi gibi kullanma.
- Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
- En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
- Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
- Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
- Tek değişiklik yap: Aynı anda birçok şeyi değiştirmek yerine bir kararı düzeltip testi yeniden çalıştır.
Başarı ölçütleri
- Kod Python 3 sözdizimiyle çalışıyor mu?
- Değişken ve fonksiyon adları amacı açıklıyor mu?
- Boş, yanlış türde ve sınırdaki girdiler denendi mi?
- Hata mesajı kullanıcıya neyi düzeltmesi gerektiğini söylüyor mu?
- Aynı kod gereksiz tekrar olmadan yeniden kullanılabiliyor mu?
“Dosyalarla Çalışmaya Giriş” çalışmasını bitirdiğinde ürünü bir arkadaşına yalnız bölüm başlıklarıyla anlat. Arkadaşın bir dosyadaki satırları okuyup basit özet çıkaran araç senaryosundaki adımları ve karar nedenlerini takip edebiliyorsa anlatım yeterince açıktır. Anlaşılmayan noktayı daha fazla terim ekleyerek değil, Dosyaya yazmak ve dosyadan okumak ve Dosyayı geri okumak ilişkisini daha küçük adımlara bölerek düzelt.
Sık yapılan hatalar
\n koymayı unutmak
Her f.write(...) çağrısına satır sonu eklemezsen bütün maddeler tek satırda birleşir: Süt alKitabı geri ver. Her satırın sonuna \n eklemeyi alışkanlık hâline getir.
"w" ile istemeden veri silmek
Var olan bir dosyayı "w" kipiyle açmak eski içeriği anında siler. Not eklemek istiyorsan "a", sadece okumak istiyorsan "r" kullan.
strip() unutmak
Satırları okurken strip() kullanmazsan sondaki \n yüzünden çıktıda fazladan boş satırlar görürsün. Ekrana yazdırırken satırları temizle.
Olmayan dosyayı okumaya çalışmak
Henüz yazmadığın bir dosyayı "r" ile açarsan FileNotFoundError alırsın. Önce yaz, sonra oku; ya da dosyanın klasörde gerçekten olduğundan emin ol.
Güvenlik notu
Dosyalarla çalışırken birkaç basit kurala uy:
- Yalnızca kendi oluşturduğun veya öğretmeninin/velinin güvendiği dosyaları aç ve çalıştır. İnternetten indirdiğin tanımadığın bir kodu körü körüne çalıştırma.
- Dosyalara kişisel bilgi yazma: şifre, adres, telefon, TC kimlik numarası veya aile bilgileri kod dosyalarında saklanmamalı.
"w"kipi dosya içeriğini silebilir. Silme veya üzerine yazma yapan bir programı, önemli dosyaların bulunduğu klasörde değil, ayrı bir deneme klasöründe çalıştır.- Emin olmadığın bir dosya işlemini bir yetişkinle birlikte yap.
Ders özeti
- Dosya, program kapansa bile diskte kalan bir bilgi saklama alanıdır.
with open(...) as fkalıbı dosyayı güvenle açar ve iş bitince kendiliğinden kapatır."r"okur,"w"sıfırdan yazar ve eskiyi siler,"a"sonuna ekler.for satir in file bir dosyayı satır satır okuyabiliriz;strip()sondaki\nkarakterini temizler.- Yalnız kendi güvendiğin dosyalarla çalış ve dosyalara kişisel bilgi yazma.
Kontrol soruları
with open("veri.txt", "r") as fsatırındaki"r"neyi ifade eder?"w"kipiyle var olan bir dosyayı açarsan eski içeriğine ne olur?f.write("Merhaba")yazdığında satır sonu eklemezsen ne olur?- Bir dosyanın sonuna eski içeriği silmeden yeni satır eklemek için hangi kipi kullanırsın?
- Satırları okurken
satir.strip()ne işe yarar?
Cevaplar
"r"read (okuma) kipidir. Dosya sadece okunur, içine yazılamaz.- Eski içerik tamamen silinir.
"w"dosyayı sıfırdan yazar; bu yüzden dikkatli kullanılmalıdır. - Sonraki yazılan metin öncekiyle aynı satırda birleşir. Alt alta yazmak için
"\n"eklemek gerekir. "a"(append, ekleme) kipi. Eski satırlar korunur, yeni satır sona eklenir.- Her satırın sonundaki görünmez
\n(satır sonu) karakterini temizler; böylece çıktıda fazladan boş satır oluşmaz.
Kaynak ve doğrulama notu
“Dosyalarla Çalışmaya Giriş” dersi için doğrulama odağı Dosyaya yazmak ve dosyadan okumak ile Dosyayı geri okumak arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Kod örnekleri Python 3 sözdizimi esas alınarak hazırlanmıştır. Çalıştırma ortamına göre küçük farklar görülebileceği için örnekler önce güvenli bir çevrim içi editörde veya yerel geliştirme ortamında denenmelidir.
Sonraki ders
Rastgelelik ve Basit Oyun Mantığı: random modülüyle zar atmayı, rastgele seçim yapmayı ve ilk küçük tahmin oyununu kurmayı öğreneceğiz.