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.
| Rejim | Mənası | Fayl artıq varsa |
|---|---|---|
'r' | oxumaq (susmaya görə) | məzmun oxunur; fayl yoxdursa — FileNotFoundError |
'w' | yazmaq | köhnə məzmun silinir |
'a' | sona əlavə etmək | yeni mətn sona yazılır |
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:
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:
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.
- 1Verilənləri hazırla
Qiymətləri
grades.csvfaylına yaz. Bir sətirdə qəsdən səhv qoyuruq (x) ki, proqramın buna necə reaksiya verdiyini görək. - 2Faylı 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. - 3Səhvləri tut
int('x')ValueErrorverəcək —try/exceptilə onu tut, xəbərdarlıq çap et və həmin sətri keç. - 4Hesabla və hesabatı yaz
Funksiyalarla orta qiyməti və səviyyəni tap, nəticələri
report.txtfaylına yaz və yoxlamaq üçün geri oxu.
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]}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:
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
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.
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
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.
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-istrip()təmizləyir.- Olmayan faylı oxumaq
FileNotFoundErrorverir — onutry/exceptilə 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.