--- baslik: Dosyalar bolum: Hatalar ve dosyalar ozet: Dosyaya yazmak, sonuna eklemek, geri okumak ve JSON ile saklamak --- Program bittiğinde değişkenlerdeki her şey kaybolur. Bilgiyi saklamak için dosyaya yazarsın; program bir sonraki çalışmada onu geri okuyabilir. Dosya işlemleri `dosya` modülündedir; `kullan kaba.sistem` ile gelir. > **Not:** Bu dersteki örnekler çalıştıkları klasörde dosya oluşturur. Her örnek önce yazar, sonra aynı programda geri okur. ## Yazmak ve okumak `dosya.yaz(yol, metin)` dosyayı oluşturur; dosya varsa içeriğini **silip** yeniden yazar. `dosya.oku(yol)` bütün dosyayı tek bir metin olarak verir. ```kbl kullan kaba.sistem dosya.yaz("selam.txt", "Merhaba dosya!\n") icerik = dosya.oku("selam.txt") yazdir(icerik) ``` ```cikti Merhaba dosya! ``` Her satırın sonuna `\n` koyarsın; yoksa satırlar yan yana birleşir. ## Sonuna eklemek `dosya.ekle(yol, metin)` var olan içeriğe dokunmadan sonuna ekler. ```kbl kullan kaba.sistem dosya.yaz("gunluk.txt", "Pazartesi: 5 km koştum\n") dosya.ekle("gunluk.txt", "Salı: dinlendim\n") dosya.ekle("gunluk.txt", "Çarşamba: 7 km koştum\n") yazdir(dosya.oku("gunluk.txt")) ``` ```cikti Pazartesi: 5 km koştum Salı: dinlendim Çarşamba: 7 km koştum ``` > **Dikkat:** Bir kayıt eklemek istiyorken `dosya.yaz` kullanırsan dosyadaki eski her şey silinir. Eklemek için `dosya.ekle` kullan. ## Satır satır işlemek Okuduğun metni `kirp()` ile sondaki `\n`'den arındırıp `bol("\n")` ile satırlara ayırırsın. Her satırı da `;` gibi bir ayraçla bölüp alanlara ulaşırsın. ```kbl kullan kaba.sistem dosya.yaz("alisveris.txt", "ekmek;2;12.50\n") dosya.ekle("alisveris.txt", "süt;1;34.90\n") dosya.ekle("alisveris.txt", "domates;3;18.75\n") toplam = 0.0 dongu satir icinde dosya.oku("alisveris.txt").kirp().bol("\n"): parca = satir.bol(";") adet = sayi(parca[1]) tutar = adet * ondalik(parca[2]) toplam += tutar yazdir(f"{parca[0]:<10}{adet:>3}{tutar:>9.2f}") yazdir(f"{'Toplam':<13}{toplam:>9.2f} TL") ``` ```cikti ekmek 2 25.00 süt 1 34.90 domates 3 56.25 Toplam 116.15 TL ``` ## Dosya var mı? Olmayan bir dosyayı okumak hata vermez, boş metin döndürür. Bu yüzden önce `dosya.var_mi()` ile sorarsın. `dosya.sil()` dosyayı siler. ```kbl kullan kaba.sistem dosya.yaz("gecici.txt", "deneme\n") yazdir(dosya.var_mi("gecici.txt")) dosya.sil("gecici.txt") yazdir(dosya.var_mi("gecici.txt")) eger degil dosya.var_mi("ayarlar.txt"): yazdir("ayarlar.txt yok, varsayılanlar kullanılacak.") ``` ```cikti doğru yanlış ayarlar.txt yok, varsayılanlar kullanılacak. ``` ## JSON ile saklamak JSON, sözlük ve listeleri metne çevirmenin yaygın bir biçimidir; başka programlar da okuyabilir. `json.uret()` bir sözlüğü metne çevirir, `json.coz()` metni geri çözer. ```kbl kullan kaba.sistem ayarlar = {"tema": "koyu", "yazi_boyutu": 14} dosya.yaz("ayarlar.json", json.uret(ayarlar)) yazdir(dosya.oku("ayarlar.json")) okunan = json.coz(dosya.oku("ayarlar.json")) yazdir(f"Tema: {metin(okunan['tema'])}") yazdir(f"Yazı boyutu + 2: {sayi(okunan['yazi_boyutu']) + 2}") ``` ```cikti {"tema":"koyu","yazi_boyutu":14} Tema: koyu Yazı boyutu + 2: 16 ``` JSON'dan çözülen değerin türü derleme anında bilinmez; `metin()` ve `sayi()` ile hangi türde kullanacağını açıkça söylersin. > **İpucu:** Bozuk olabilecek bir dosyayı çözmeden önce `json.gecerli_mi(metin)` ile denetle; geçerli değilse `yanlis` döner. ## Alıştırma ```alistirma `notlar.txt` dosyasına üç satır yaz: `Ayşe;88`, `Can;47`, `Elif;92` (ilkini `yaz`, diğerlerini `ekle` ile). Sonra dosyayı okuyup her satırı bölerek notların ortalamasını 1 basamakla `Ortalama: 75.7` biçiminde yazdır. %%% kullan kaba.sistem # buraya yaz %%% kullan kaba.sistem dosya.yaz("notlar.txt", "Ayşe;88\n") dosya.ekle("notlar.txt", "Can;47\n") dosya.ekle("notlar.txt", "Elif;92\n") toplam = 0 satirlar = dosya.oku("notlar.txt").kirp().bol("\n") dongu satir icinde satirlar: toplam += sayi(satir.bol(";")[1]) yazdir(f"Ortalama: {toplam / satirlar.uzunluk():.1f}") %%% Ortalama: 75.7 ```