- dersler/: 29 kısa ders (açıklama, çalıştırılabilir örnek, alıştırma). Her örneğin ve alıştırma çözümünün çıktısı Online IDE'nin hazırlık adımında gerçekten koşulup dosyadakiyle karşılaştırılır; biçim dersler/BICIM.md. - temeller/: tek konulu 12 başlangıç programı. - web/anket, web/kisalt, web/pano: port PORT ortam değişkeninden okunur (Online IDE önizlemesi 8080 verir), yoksa eski sabit port. - README: öğrenme bölümü, Online IDE bağlantısı.
136 lines
4.1 KiB
Markdown
136 lines
4.1 KiB
Markdown
---
|
|
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
|
|
```
|