18-dars: Fayl va CSV
5-blokHaqiqiy programma17–20 darslar
Bu darsdan keyin siz
- faylni
with openbilan o’qiydi va yozasiz - CSV formatini qatorlarga va ustunlarga ajratasiz
- fayl bilan ishlashdagi eng ko’p uchraydigan uch xatoni oldini olasiz
Nazariya
“Nazariya” bo'limiga havolawith open — va nega aynan with
“with open — va nega aynan with” bo'limiga havolaFaylni ochish, o’qish va yopish kerak. Yopilmagan fayl ma’lumotni yo’qotishi mumkin: yozilgan matn diskka hali tushmagan bo’lishi mumkin.
with bloki fayl yopilishini kafolatlaydi — hatto blok ichida xato chiqsa ham.
# O'qishwith open("baholar.txt", encoding="utf-8") as f: matn = f.read()print(len(matn))# Yozish: "w" mavjud faylni O'CHIRIB yozadiwith open("natija.txt", "w", encoding="utf-8") as f: f.write("Salom\n")# Qo'shish: "a" oxiriga qo'shadiwith open("natija.txt", "a", encoding="utf-8") as f: f.write("Ikkinchi qator\n")rejimmode
Fayl qanday ochilishi: "r" o’qish (standart), "w" yozish (eski mazmun
yo’qoladi), "a" oxiriga qo’shish.
encoding="utf-8" o’zbekcha matn uchun majburiy. Bu CF 4-darsdagi
kodlash masalasi: o' va g' bir baytga sig’maydi va kodlash ko’rsatilmasa
Windows’da matn buzilib o’qiladi.
Faylni qatorma-qator o’qish
“Faylni qatorma-qator o’qish” bo'limiga havolaKatta faylni read() bilan butunlay o’qish xotirani to’ldiradi. To’g’ri yo’l —
sikl bilan qatorma-qator yurish.
with open("baholar.csv", encoding="utf-8") as f: for qator in f: print(qator.strip())strip() majburiy: har qator oxirida ko’rinmas satr uzish belgisi (\\n) turadi
va u int() ga tushsa xato beradi.
CSV — eng oddiy jadval formati
“CSV — eng oddiy jadval formati” bo'limiga havolaCSV faylda har qator bitta yozuv, ustunlar vergul bilan ajratiladi. Birinchi qator odatda sarlavha bo’ladi.
CSVcomma-separated values
Vergul bilan ajratilgan qiymatlar. Excel ham, Google Sheets ham shu formatda saqlaydi — shuning uchun u ma’lumot almashishning eng keng yo’li.
jami = 0soni = 0with open("baholar.csv", encoding="utf-8") as f: f.readline() # sarlavhani tashlab yuboramiz for qator in f: qismlar = qator.strip().split(",") jami += int(qismlar[1]) soni += 1print("O'rtacha:", jami / soni)Bu — 7-darsdagi akkumulyator naqshining haqiqiy ma’lumot ustidagi ko’rinishi. Yangi narsa faqat manba: ro’yxat emas, fayl.
Uch xato — hammasi bir marta uchraydi
“Uch xato — hammasi bir marta uchraydi” bo'limiga havolaBirinchisi: sarlavhani tashlab yubormaslik — int("baho") ValueError beradi.
Ikkinchisi: strip() ni unutish — satr uzish belgisi bilan int() xato
beradi. Uchinchisi va eng ayyori: fayl oxiridagi bo’sh qator — u ko’rinmaydi,
lekin sikl uni ham o’qiydi.
Bashorat qiling
“Bashorat qiling” bo'limiga havolaAvval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
qator = "Aziza,5\n"qismlar = qator.split(",")print(qismlar)print(int(qismlar[1]))Haqiqiy natija:
['Aziza', '5\n'] 5
split() satr uzish belgisini olib tashlamaydi — u ikkinchi elementning ichida qoladi. int() bu holatda ishlaydi, chunki u atrofdagi bo'shliqlarni o'zi tashlaydi. Lekin taqqoslashda ('5\\n' == '5') bu False beradi — shuning uchun strip() har doim yoziladi.
Javobni ko'rish
['Aziza', '5\n'] 5
split() satr uzish belgisini olib tashlamaydi — u ikkinchi elementning ichida qoladi. int() bu holatda ishlaydi, chunki u atrofdagi bo'shliqlarni o'zi tashlaydi. Lekin taqqoslashda ('5\\n' == '5') bu False beradi — shuning uchun strip() har doim yoziladi.
Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
qator = ""qismlar = qator.strip().split(",")print(qismlar)print(len(qismlar))Haqiqiy natija:
[''] 1
Bo'sh satrni split qilsangiz, bo'sh ro'yxat emas — bitta bo'sh elementli ro'yxat chiqadi. Shuning uchun qismlar[1] IndexError beradi: ikkinchi element yo'q.
Javobni ko'rish
[''] 1
Bo'sh satrni split qilsangiz, bo'sh ro'yxat emas — bitta bo'sh elementli ro'yxat chiqadi. Shuning uchun qismlar[1] IndexError beradi: ikkinchi element yo'q.
Sinab ko’r
“Sinab ko’r” bo'limiga havolaIkki variantni ketma-ket bajaring. Ikkinchisi — fayl oxiridagi bo’sh qator — sinfda haqiqatan uchraydigan xato va uni bir marta ko’rgan o’quvchi keyin darhol taniydi.
CSV tahlilchi
Variantni tanlab qadamlang: fayl qatorma-qator o'qiladi. Klaviatura: → keyingi qadam.
Bu simulyatorda CSV fayl qatorma-qator o'qiladi va akkumulyatorlar (jami, soni) har qadamda o'sib boradi. Oxirida o'rtacha hisoblanadi.
JavaScript'siz eng muhim holat: fayl oxirida bo'sh qator bo'lsa,qator.strip().split(",") bitta bo'sh elementli ro'yxat beradi vaqismlar[1] IndexError chiqaradi. Bo'sh qator ko'rinmaydi — shuning uchun sikl boshida tekshiruv qo'yiladi.
baholar.csv
Akkumulyatorlar
| jami | 0 |
|---|---|
| soni | 0 |
Xatoni toping
“Xatoni toping” bo'limiga havolaBu kod ataylab buzuq — xatoni toping
with open("baholar.csv", encoding="utf-8") as f: for qator in f: qismlar = qator.strip().split(",") print(qismlar[0], int(qismlar[1]))Python shunday javob beradi:
Traceback (most recent call last): File "csv_oqish.py", line 4, in <module> print(qismlar[0], int(qismlar[1])) ValueError: invalid literal for int() with base 10: 'baho'
Sababi va tuzatish
Sarlavha qatori ham siklga tushdi. int(«baho») — sonni satrdan o'girib bo'lmaydi.
Ikki yechim bor. Birinchisi — sarlavhani oldindan o’qib tashlash:
with open("baholar.csv", encoding="utf-8") as f: f.readline() # sarlavha for qator in f: qismlar = qator.strip().split(",") if len(qismlar) < 2: # bo'sh yoki chala qator continue print(qismlar[0], int(qismlar[1]))Ikkinchi qo’shimcha ham qoldirildi va u tasodifiy emas: len(qismlar) < 2
tekshiruvi bo’sh qatorni ham, chala qatorni ham bir yo’la ushlaydi. Haqiqiy
ma’lumot har doim iflos bo’ladi.
O’zingizni sinang
“O’zingizni sinang” bo'limiga havola1Nega with open ishlatiladi?
Javobni ko'rish
U fayl yopilishini kafolatlaydi — blok ichida xato chiqsa ham. Yopilmagan fayl ma’lumotni yo’qotishi mumkin.
2«w» va «a» rejimlari farqi nimada?
Javobni ko'rish
"w" mavjud mazmunni so’ramasdan o’chiradi, "a" esa oxiriga qo’shadi.
3encoding=«utf-8» nega majburiy?
Javobni ko'rish
O’zbekcha harflar (o', g', sh) bir baytga sig’maydi. Kodlash
ko’rsatilmasa Windows’da matn buzilib o’qiladi.
4Bo'sh satrni strip().split(«,») qilsangiz nima qaytadi?
Javobni ko'rish
[''] — bitta bo’sh elementli ro’yxat. Bo’sh ro’yxat emas, shuning uchun
qismlar[1] IndexError beradi.
5Fayl oxiridagi bo'sh qatordan qanday himoyalanasiz?
Javobni ko'rish
Sikl boshida tekshiruv: if len(qismlar) < 2: continue. Bu bo’sh qatorni ham,
chala qatorni ham ushlaydi.
Topshiriq
“Topshiriq” bo'limiga havolaTopshiriq — darajangizni tanlang
Asos · 5–7-sinf — Vizual va aniq ko'rsatmali
baholar.csv faylini qo’lda yasang: birinchi qator ism,baho, keyin beshta
o’quvchi. Programma yozib, har qatorni ekranga chiqaring. Keyin faylga
oltinchi o’quvchini "a" rejimi bilan qo’shing.
Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz
Xuddi shu fayldan o’rtacha bahoni, eng yuqori bahoni va 5 olganlar sonini hisoblaydigan programma yozing — 7-darsdagi to’rt naqshdan uchtasi. Keyin fayl oxiriga bo’sh qator qo’shib, programma buzilishini ko’rib himoya qo’shing.
Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan
Natijalarni yangi CSV faylga yozadigan programma yozing: har o’quvchi
uchun ism, baho va o’rtachadan qanchalik farq qilgani. Keyin uch chegara
holatini sinab ko’ring: bo’sh fayl, faqat sarlavhali fayl, ichida vergul
bo’lgan ism ("Aliyev, Bekzod"). Oxirgisi CSV formatining haqiqiy
muammosi — nima qilish kerakligini o’zingiz hal qilib, qaroringizni izohda
yozing.
Darsni belgilash uchun JavaScript kerak. Bu progressni saqlash uchun ishlatiladi — darslikning o'zi JavaScript'siz ham to'liq o'qiladi.