Asosiy mazmunga o'tish

18-dars: Fayl va CSV

5-blokHaqiqiy programma17–20 darslar

Bu darsdan keyin siz

  • faylni with open bilan o’qiydi va yozasiz
  • CSV formatini qatorlarga va ustunlarga ajratasiz
  • fayl bilan ishlashdagi eng ko’p uchraydigan uch xatoni oldini olasiz

Faylni 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.

fayl.py
# 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.

Katta faylni read() bilan butunlay o’qish xotirani to’ldiradi. To’g’ri yo’l — sikl bilan qatorma-qator yurish.

qatorlab.py
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 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.

csv_ortacha.py
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.

Birinchisi: sarlavhani tashlab yubormaslikint("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.

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
qator = "Aziza,5\n"qismlar = qator.split(",")print(qismlar)print(int(qismlar[1]))
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.

Bashorat qiling
qator = ""qismlar = qator.strip().split(",")print(qismlar)print(len(qismlar))
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.

Ikki 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

jami0
soni0

    Bu kod ataylab buzuq — xatoni toping

    Buzuq kod
    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:

    tuzatilgan.py
    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.

    1Nega 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 — 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.