# Dosyalar: metin ve JSON dosyasına yazmak, dosyayı geri okuyup işlemek # # Program bittiğinde değişkenlerdeki her şey kaybolur. Bilgiyi saklamak için # dosyaya yazarız; program bir sonraki çalışmada onu geri okuyabilir. # Bu ders çalıştığı klasörde iki dosya oluşturur: alisveris.txt ve sinif.json. # Program bitince dosyalar yerinde kalır; açıp içlerine bakabilirsin. kullan kaba.sistem degismez LISTE_DOSYASI = "alisveris.txt" degismez JSON_DOSYASI = "sinif.json" # ── 1. Metin dosyasına yazmak ───────────────────────────────── # dosya.yaz(yol, metin) dosyayı oluşturur; dosya zaten varsa içeriğini SİLİP yeniden yazar. # Her satırın sonuna \n koyuyoruz; yoksa bütün satırlar yan yana birleşirdi. # Satır biçimimiz: ürün;adet;birim fiyat dosya.yaz(LISTE_DOSYASI, "ekmek;2;12.50\n") # dosya.ekle(yol, metin) var olan içeriğe dokunmadan sonuna ekler. dosya.ekle(LISTE_DOSYASI, "süt;1;34.90\n") dosya.ekle(LISTE_DOSYASI, "domates;3;18.75\n") dosya.ekle(LISTE_DOSYASI, "peynir;1;149.00\n") yazdir(f"{LISTE_DOSYASI} yazıldı: {dosya.boyut(LISTE_DOSYASI)} bayt") # ── 2. Metin dosyasını okumak ───────────────────────────────── # dosya.oku(yol) bütün dosyayı tek bir metin olarak verir. # Olmayan bir dosyayı okumak hata vermez, boş metin döner; bu yüzden önce var_mi() ile soruyoruz. eger dosya.var_mi(LISTE_DOSYASI): icerik = dosya.oku(LISTE_DOSYASI) # kirp() sondaki \n'yi atar, bol("\n") metni satırlara ayırır. satirlar = icerik.kirp().bol("\n") yazdir(f"{satirlar.uzunluk()} satır okundu:") yazdir() toplam = 0.0 yazdir(f" {'Ürün':<10}{'Adet':>5}{'Fiyat':>9}{'Tutar':>10}") yazdir(" " + "─".tekrarla(34)) dongu satir icinde satirlar: # Her satırı ; işaretinden bölüp parçaları uygun türe çeviriyoruz. parca = satir.bol(";") urun = parca[0] adet = sayi(parca[1]) fiyat = ondalik(parca[2]) tutar = adet * fiyat toplam += tutar yazdir(f" {urun:<10}{adet:>5}{fiyat:>9.2f}{tutar:>10.2f}") yazdir(" " + "─".tekrarla(34)) yazdir(f" {'Toplam':<24}{toplam:>10.2f} TL") yazdir() eger degil dosya.var_mi("olmayan-dosya.txt"): yazdir("olmayan-dosya.txt bulunamadı (beklenen durum).") yazdir() # ── 3. JSON dosyasına yazmak ────────────────────────────────── # JSON, sözlük ve listeleri metne dönüştürmenin yaygın bir biçimidir; başka # programlar ve diller de okuyabilir. Önce bilgiyi sözlüklerle kuruyoruz. ogrenciler = {} ogrenciler["Ayşe"] = {"not": 88, "sehir": "Eskişehir"} ogrenciler["Mehmet"] = {"not": 64, "sehir": "Konya"} ogrenciler["Elif"] = {"not": 92, "sehir": "Trabzon"} ogrenciler["Can"] = {"not": 47, "sehir": "Mersin"} # Adı "sinif" koyamıyoruz: sinif dilin anahtar sözcüğü, değişken adı olamaz. sinif_bilgisi = {"ad": "9-A", "ogretmen": "Deniz Arslan", "ogrenciler": ogrenciler} # json.uret(sozluk, dogru) okunaklı, girintili bir JSON metni üretir. # (İkinci değer yazılmazsa her şey tek satıra sıkıştırılır.) # Anahtarlar dosyaya alfabetik sırayla yazılır. json_metni = json.uret(sinif_bilgisi, dogru) dosya.yaz(JSON_DOSYASI, json_metni) yazdir(f"{JSON_DOSYASI} yazıldı. İçeriği:") yazdir(json_metni) # ── 4. JSON dosyasını geri okumak ───────────────────────────── okunan = dosya.oku(JSON_DOSYASI) # Bozuk bir dosyayı çözmeye kalkmadan önce geçerli JSON olup olmadığını soruyoruz. eger json.gecerli_mi(okunan): veri = json.coz(okunan) # Çözülen veride anahtarlarla iç içe ilerlenir: veri["ogrenciler"]["Elif"]["not"]. # JSON'dan gelen değerin türü derleme anında bilinmez; sayi() ve metin() ile # hangi türde kullanacağımızı açıkça söylüyoruz. yazdir(f"Sınıf {metin(veri['ad'])}, öğretmen {metin(veri['ogretmen'])}") toplam_not = 0 sayac = 0 dongu ad icinde veri["ogrenciler"].anahtarlar(): kayit = veri["ogrenciler"][ad] notu = sayi(kayit["not"]) toplam_not += notu sayac += 1 durum = "geçti" eger notu < 50: durum = "kaldı" yazdir(f" {ad:<8}{metin(kayit['sehir']):<11}{notu:>4} {durum}") yazdir(f"Ortalama: {toplam_not / sayac:.1f}") degilse: yazdir(f"{JSON_DOSYASI} geçerli bir JSON değil.") # Bozuk JSON örneği: süslü parantez kapanmamış. bozuk = "{\"ad\": \"9-A\"" yazdir() yazdir(f"{bozuk} geçerli JSON mu? {json.gecerli_mi(bozuk)}")