İçeriğe geç
Educora
İleri20 dk14 / 42

Dosyalar ve mini proje: not hesaplayıcı

Dosyalara yazmayı ve dosyalardan okumayı öğren, ardından kurs boyunca öğrendiklerini bir not hesaplayıcı projesinde birleştir.

Kendini test et
Bu derste öğreneceklerin
  • with open(...) ile dosyaya yazmak ve dosyadan okumak
  • 'r', 'w' ve 'a' kiplerini ayırt etmek
  • Değişkenleri, döngüleri, fonksiyonları, sözlükleri ve hata yönetimini tek bir programda birleştirmek

Bir program biter bitmez tüm değişkenleri bellekten silinir: oyundaki rekor, defterdeki notlar, alışveriş listesi... Hepsi kaybolur. Verileri saklamak için onları bir dosyaya yazmak gerekir. Bu derste dosyalarla çalışmayı öğrenecek, ardından kurs boyunca öğrendiğin her şeyi gerçek bir projede, yani bir not hesaplayıcıda birleştireceksin.

Dosyaya yazmak ve dosyadan okumak

open() fonksiyonu bir dosyayı açar: ilk argüman dosyanın adı, ikincisi ise kiptir (mod). with ifadesi, blok bittiğinde dosyayı otomatik olarak kapatır; hata olsa bile. encoding='utf-8' ise ğ, ş, ı gibi harflerin doğru saklanmasını sağlar.

KipAnlamıDosya zaten varsa
'r'okuma (varsayılan)içerik okunur; dosya yoksa FileNotFoundError
'w'yazmaeski içerik silinir
'a'sona eklemeyeni metin sona eklenir
Python
with open('notes.txt', 'w', encoding='utf-8') as f:
    f.write('Python is fun\n')
    f.write('Files keep data\n')

with open('notes.txt', encoding='utf-8') as f:
    for line in f:
        print(line.strip())
▸ Beklenen çıktı
Python is fun
Files keep data

write() satır sonuna yeni satır karakteri eklemez; bu yüzden \n'i kendimiz yazarız. Dosyayı for döngüsüyle satır satır okurken bu \n her satırın sonunda kalır; strip() onu temizler. Tüm satırları bir kerede liste olarak almak için readlines() kullanılır:

Python
with open('log.txt', 'w', encoding='utf-8') as f:
    f.write('Day 1: started Python\n')

with open('log.txt', 'a', encoding='utf-8') as f:
    f.write('Day 2: learned loops\n')

with open('log.txt', encoding='utf-8') as f:
    lines = f.readlines()
print(len(lines), 'lines')
print(lines[-1].strip())
▸ Beklenen çıktı
2 lines
Day 2: learned loops

Var olmayan bir dosyayı okumaya çalışırsan FileNotFoundError oluşur. Hata yönetimi dersindeki gibi onu try / except ile yakalayabilirsin:

Python
try:
    with open('missing.txt', encoding='utf-8') as f:
        print(f.read())
except FileNotFoundError:
    print('File not found, starting with an empty list.')
▸ Beklenen çıktı
File not found, starting with an empty list.

Mini proje: not hesaplayıcı

Bir öğretmen öğrencilerin notlarını basit bir metin dosyasında tutuyor: her satırda bir ad ve virgülle ayrılmış notlar var. Bu biçime CSV (comma-separated values, yani virgülle ayrılmış değerler) denir. Programımız dosyayı okuyacak, hatalı satırları atlayacak, her öğrencinin ortalamasını hesaplayacak ve raporu yeni bir dosyaya yazacak.

  1. 1
    Verileri hazırla

    Notları grades.csv dosyasına yaz. Programın nasıl tepki verdiğini görmek için bir satıra bilerek hata (x) koyuyoruz.

  2. 2
    Dosyayı oku ve ayrıştır

    Her satırı split(',') ile parçalara ayır: ilk parça ad, kalanlar notlardır. Onları int() ile sayıya çevir ve bir sözlüğe kaydet.

  3. 3
    Hataları yakala

    int('x') bir ValueError verir; onu try / except ile yakala, bir uyarı yazdır ve o satırı atla.

  4. 4
    Hesapla ve raporu yaz

    Fonksiyonlarla ortalamayı ve seviyeyi bul, sonuçları report.txt dosyasına yaz ve kontrol etmek için geri oku.

Python
lines = ['Aysel,5,4,5,5', 'Murad,4,3,4', 'Leyla,5,5,4,5', 'Elvin,3,x,4', 'Nigar,2,3,3']
with open('grades.csv', 'w', encoding='utf-8') as f:
    f.write('\n'.join(lines))

journal = {}
with open('grades.csv', encoding='utf-8') as f:
    for line in f:
        parts = line.strip().split(',')
        name = parts[0]
        try:
            journal[name] = [int(m) for m in parts[1:]]
        except ValueError:
            print(f'Skipped {name}: bad data')
print(journal)
▸ Beklenen çıktı
Skipped Elvin: bad data
{'Aysel': [5, 4, 5, 5], 'Murad': [4, 3, 4], 'Leyla': [5, 5, 4, 5], 'Nigar': [2, 3, 3]}
Adım 1–3: dosya oluşturulur ve okunur, hatalı satır atlanır. parts[1:] dilimi addan sonraki tüm parçaları alır.

Şimdi hesabı iki fonksiyona ayıralım: average ortalamayı, level ise seviyeyi bir kelimeyle döndürür (eşikleri kendimiz seçtik). Bir sözlük üreteci tüm ortalamaları tek satırda hesaplar, sonuç da report.txt dosyasına yazılır:

Python
journal = {'Aysel': [5, 4, 5, 5], 'Murad': [4, 3, 4], 'Leyla': [5, 5, 4, 5], 'Nigar': [2, 3, 3]}

def average(scores):
    return sum(scores) / len(scores)

def level(avg):
    if avg >= 4.5:
        return 'excellent'
    elif avg >= 3.5:
        return 'good'
    elif avg >= 2.5:
        return 'satisfactory'
    return 'needs help'

averages = {name: average(s) for name, s in journal.items()}
with open('report.txt', 'w', encoding='utf-8') as f:
    for name, avg in averages.items():
        f.write(f'{name}: {avg:.2f} ({level(avg)})\n')

with open('report.txt', encoding='utf-8') as f:
    print(f.read().strip())
print(f'Best average: {max(averages.values()):.2f}')
▸ Beklenen çıktı
Aysel: 4.75 (excellent)
Murad: 3.67 (good)
Leyla: 4.75 (excellent)
Nigar: 2.67 (satisfactory)
Best average: 4.75
Alıştırma

fruits listesindeki her meyveyi ayrı bir satır olarak fruits.txt dosyasına yaz ('w' kipi). Ardından dosyayı oku ve satırlarını 1'den başlayan numaralarla, 1. apple biçiminde yazdır.

Alıştırma · Python
fruits = ['apple', 'pomegranate', 'fig']
# 1) write each fruit on its own line to fruits.txt
# 2) read fruits.txt and print: 1. apple, 2. pomegranate, ...
▸ Beklenen çıktı
1. apple
2. pomegranate
3. fig
Alıştırma

Mini proje: sales.csv dosyasının her satırı ürün,adet,fiyat biçimindedir. Dosyayı oku ve her ürünün kazandırdığı parayı (adet × fiyat) bir sözlükte topla. Hatalı veri içeren satırı try/except ile atla ve Skipped: ile birlikte o satırı yazdır. En sonda ürünleri alfabetik sırayla cup: 2.00 AZN biçiminde, en son da aynı biçimde Total: satırını yazdır.

Alıştırma · Python
lines = ['pen,3,0.5', 'notebook,2,1.25', 'bag,1,x', 'pen,4,0.5']
with open('sales.csv', 'w', encoding='utf-8') as f:
    f.write('\n'.join(lines))

totals = {}
# 1) read sales.csv line by line: product,quantity,price
# 2) skip bad lines (print Skipped: and the line)
# 3) add quantity * price to totals[product]
# 4) print the products in alphabetical order, then the Total
▸ Beklenen çıktı
Skipped: bag,1,x
notebook: 2.50 AZN
pen: 3.50 AZN
Total: 6.00 AZN

Önemli noktalar

  • with open(ad, kip, encoding='utf-8') as f: dosyayı açar ve blok bitince otomatik olarak kapatır.
  • 'r' okur, 'w' eski içeriği silip yazar, 'a' sona ekler.
  • write() \n eklemez; okunan satırlardaki \n'i strip() temizler.
  • Var olmayan bir dosyayı okumak FileNotFoundError verir; onu try / except ile yakala.
  • CSV satırları split(',') ile parçalara ayrılabilir.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Eski içeriği silmeden dosyaya metin eklemek için hangi kip gerekir?