Məzmuna keç
Educora
İrəli20 dəq14 / 42

Fayllar və mini-layihə: qiymət kalkulyatoru

Fayllara yazmağı və fayllardan oxumağı öyrən, sonra kurs boyu öyrəndiklərini qiymət kalkulyatoru layihəsində birləşdir.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • with open(...) ilə fayla yazmaq və fayldan oxumaq
  • 'r', 'w' və 'a' rejimlərini fərqləndirmək
  • Dəyişənləri, dövrləri, funksiyaları, lüğətləri və xətaların idarəsini bir proqramda birləşdirmək

Proqram bitən kimi bütün dəyişənlər yaddaşdan silinir: oyunun rekordu, jurnaldakı qiymətlər, alış-veriş siyahısı — hamısı itir. Məlumatı saxlamaq üçün onu fayla yazmaq lazımdır. Bu dərsdə fayllarla işləməyi öyrənəcəksən, sonra isə kurs boyu öyrəndiyin hər şeyi bir real layihədə — qiymət kalkulyatorunda birləşdirəcəksən.

Fayla yazmaq və fayldan oxumaq

open() funksiyası faylı açır: birinci arqument faylın adı, ikincisi isə rejimdir. with operatoru faylı blok bitəndə avtomatik bağlayır — hətta xəta baş versə belə. encoding='utf-8' isə ə, ö, ş kimi hərflərin düzgün saxlanmasını təmin edir.

RejimMənasıFayl artıq varsa
'r'oxumaq (susmaya görə)məzmun oxunur; fayl yoxdursa — FileNotFoundError
'w'yazmaqköhnə məzmun silinir
'a'sona əlavə etməkyeni mətn sona yazılır
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())
▸ Gözlənilən nəticə
Python is fun
Files keep data

write() sətrin sonuna yeni sətir simvolu əlavə etmir, ona görə \n-i özümüz yazırıq. Faylı for dövrü ilə sətir-sətir oxuyanda hər sətrin sonunda həmin \n qalır — strip() onu təmizləyir. Bütün sətirləri birdən siyahı kimi almaq üçün readlines() istifadə olunur:

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())
▸ Gözlənilən nəticə
2 lines
Day 2: learned loops

Olmayan faylı oxumağa çalışsan, FileNotFoundError yaranacaq. Xətaların idarəsi dərsindəki kimi, onu try / except ilə tutmaq olar:

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.')
▸ Gözlənilən nəticə
File not found, starting with an empty list.

Mini-layihə: qiymət kalkulyatoru

Müəllim şagirdlərin qiymətlərini sadə mətn faylında saxlayır: hər sətirdə ad və vergüllə ayrılmış qiymətlər. Bu formata CSV (comma-separated values — vergüllə ayrılmış qiymətlər) deyilir. Proqramımız faylı oxuyacaq, səhv sətirləri keçəcək, hər şagirdin orta qiymətini hesablayacaq və hesabatı yeni fayla yazacaq.

  1. 1
    Verilənləri hazırla

    Qiymətləri grades.csv faylına yaz. Bir sətirdə qəsdən səhv qoyuruq (x) ki, proqramın buna necə reaksiya verdiyini görək.

  2. 2
    Faylı oxu və təhlil et

    Hər sətri split(',') ilə hissələrə böl: birinci hissə ad, qalanları qiymətlərdir. Onları int() ilə ədədə çevir və lüğətə yaz.

  3. 3
    Səhvləri tut

    int('x') ValueError verəcək — try / except ilə onu tut, xəbərdarlıq çap et və həmin sətri keç.

  4. 4
    Hesabla və hesabatı yaz

    Funksiyalarla orta qiyməti və səviyyəni tap, nəticələri report.txt faylına yaz və yoxlamaq üçün geri oxu.

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)
▸ Gözlənilən nəticə
Skipped Elvin: bad data
{'Aysel': [5, 4, 5, 5], 'Murad': [4, 3, 4], 'Leyla': [5, 5, 4, 5], 'Nigar': [2, 3, 3]}
Addım 1–3: fayl yaradılır, oxunur, səhv sətir keçilir. Kəsik parts[1:] addan sonrakı bütün hissələri götürür.

İndi hesablamanı iki funksiyaya ayıraq: average orta qiyməti, level isə söz ilə səviyyəni qaytarır (hədləri özümüz seçmişik). Lüğət generatoru bütün ortaları bir sətirdə hesablayır, nəticə isə report.txt faylı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}')
▸ Gözlənilən nəticə
Aysel: 4.75 (excellent)
Murad: 3.67 (good)
Leyla: 4.75 (excellent)
Nigar: 2.67 (satisfactory)
Best average: 4.75
Tapşırıq

fruits siyahısındakı hər meyvəni ayrıca sətirdə fruits.txt faylına yaz ('w' rejimi). Sonra faylı oxu və sətirləri 1-dən başlayan nömrələrlə, 1. apple şəklində çap et.

Tapşırıq · 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, ...
▸ Gözlənilən nəticə
1. apple
2. pomegranate
3. fig
Tapşırıq

Kiçik layihə: sales.csv faylının hər sətri məhsul,say,qiymət şəklindədir. Faylı oxu və hər məhsuldan qazanılan pulu (say × qiymət) lüğətdə topla. Səhv məlumatlı sətri try/except ilə keç və Skipped: sözündən sonra həmin sətri çap et. Sonda məhsulları əlifba sırası ilə cup: 2.00 AZN şəklində, ən axırda isə eyni formatda Total: sətrini çap et.

Tapşırıq · 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
▸ Gözlənilən nəticə
Skipped: bag,1,x
notebook: 2.50 AZN
pen: 3.50 AZN
Total: 6.00 AZN

Əsas fikirlər

  • with open(ad, rejim, encoding='utf-8') as f: faylı açır və blok bitəndə avtomatik bağlayır.
  • 'r' oxuyur, 'w' köhnə məzmunu silib yazır, 'a' sona əlavə edir.
  • write() \n əlavə etmir; oxunan sətirlərdən \n-i strip() təmizləyir.
  • Olmayan faylı oxumaq FileNotFoundError verir — onu try / except ilə tut.
  • CSV sətirlərini split(',') ilə hissələrə bölmək olar.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Köhnə məzmunu silmədən fayla mətn əlavə etmək üçün hansı rejim lazımdır?