Files
ornekler/temeller/12-dosyalar/dosyalar.kbl
T

108 lines
4.6 KiB
Plaintext
Raw Normal View History

# 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)}")