Bu bo'limda dastur tashqi dunyo bilan ishlay boshladi: fayllarga yozish va o'qish, pickle hamda JSON formatlari, xatolarni try-except bilan boshqarish.
Fayl ochish: with open(...)
Dastur to'xtashi bilan o'zgaruvchilardagi hamma narsa yo'qoladi; saqlanishi kerak bo'lgan ma'lumot faylga yoziladi:
with open("kundalik.txt", "w") as f:
f.write("Bugun fayllar mavzusi\n")
f.write("Ertaga testlash\n")
with open("kundalik.txt") as f:
matn = f.read()
print(matn)
Natija:
Bugun fayllar mavzusi
Ertaga testlash
withbloki tugashi bilan fayl avtomatik yopiladi — xato chiqsa ham.open()ni har doimwithbilan ishlating.\n— yangi qator belgisi;writeuni o'zi qo'ymaydi.- Katta faylni qatorma-qator o'qish xotirani tejaydi:
with open("kundalik.txt") as f:
for qator in f:
print("->", qator.strip()) # strip() chetki \n ni olib tashlaydi
Natija:
-> Bugun fayllar mavzusi
-> Ertaga testlash
Rejimlar:
| Rejim | Ma'nosi | Eski mazmun | Fayl yo'q bo'lsa |
|---|---|---|---|
r |
O'qish (standart) | O'zgarmaydi | FileNotFoundError |
w |
Yozish | O'chadi! | Yaratiladi |
a |
Oxiriga qo'shish | Saqlanadi | Yaratiladi |
Tipik xato — jurnalga qo'shmoqchi bo'lib w ochish: har ishga tushirishda fayl bo'shab qoladi. Qo'shish uchun — a.
pickle — Python obyektini saqlash
pickle istalgan Python obyektini (ro'yxat, lug'at, klass obyekti) faylga "muzlatadi" va keyin aynan qaytaradi:
import pickle
talabalar = [{"ism": "Ali", "ball": 85}, {"ism": "Vali", "ball": 92}]
with open("data.pkl", "wb") as f: # b — binar rejim, pickle uchun shart
pickle.dump(talabalar, f)
with open("data.pkl", "rb") as f:
qayta = pickle.load(f)
print(qayta[1]["ism"])
Natija:
Vali
Juftlikni yodda tuting: dump — yozish, load — o'qish; rejimlar wb/rb (binar).
JSON — universal almashinuv formati
JSON ko'rinishi Python lug'atiga deyarli bir xil, lekin matnli va universal: uni JavaScript ham, server ham, istalgan dastur ham o'qiydi. Internetdagi API'larning mutlaq ko'pchiligi JSON'da gaplashadi:
import json
sozlamalar = {"til": "uz", "tungi_rejim": True, "shrift": 14}
with open("config.json", "w") as f:
json.dump(sozlamalar, f)
with open("config.json") as f:
yuklandi = json.load(f)
print(yuklandi["til"], yuklandi["shrift"])
Natija:
uz 14
| pickle | json | |
|---|---|---|
| Format | Binar (odam o'qiy olmaydi) | Matn (ochib ko'rsa bo'ladi) |
| Kim o'qiydi | Faqat Python | Istalgan til/dastur |
| Nima saqlaydi | Deyarli istalgan obyekt | Lug'at, ro'yxat, son, matn, bool |
| Qachon | Ichki, vaqtinchalik saqlash | Almashish, sozlamalar, API |
Qoida: tashqariga chiqadigan yoki odam o'qishi mumkin bo'lgan ma'lumot — JSON; faqat o'z dasturingiz ichida aylanadigan murakkab obyekt — pickle.
try-except — xatolarni boshqarish
Lirik chekinishda xatolarni o'qishni o'rgangan edik; endi ularni ushlaymiz. Ishonchsiz amal tryga o'raladi; xato chiqsa dastur yiqilmaydi — except bloki ishlaydi:
try:
son = int(input("Son kiriting: "))
except ValueError:
print("Bu son emas!")
else:
print("Qabul qilindi:", son) # faqat xato bo'lmaganda
finally:
print("Dastur davom etadi") # har doim
Foydalanuvchi "abc" kiritganda Natija:
Bu son emas!
Dastur davom etadi
To'rt blokning vazifasi: try — xavfli kod; except — xato ushlanganda; else — xato bo'lmaganda; finally — har qanday holatda (masalan, yakunlash ishlari).
Fayl bilan klassik qolip:
try:
with open("yoq_fayl.txt") as f:
matn = f.read()
except FileNotFoundError:
print("Fayl topilmadi — yangisini yaratamiz")
Natija:
Fayl topilmadi — yangisini yaratamiz
Ikki qoida:
- Aniq xato turini ushlang:
except ValueError:— yaxshi; yalang'ochexcept:— yomon, chunki u kodingizdagi haqiqiy xatolarni ham yashiradi. tryblokini imkon qadar qisqa tuting — faqat xavfli qatorlar ichida bo'lsin; aks holda qaysi amal xato berganini bilish qiyinlashadi.
Va "Son topish" o'yinidagi himoyaning try-except versiyasi — while bilan birga:
while True:
try:
yosh = int(input("Yoshingiz: "))
break
except ValueError:
print("Raqam kiriting")
Eslab qoling
with open(...)— fayl avtomatik yopiladi; rejimlar:ro'qish,wo'chirib yozish,aqo'shish.\n— yangi qator; qatorma-qator o'qish —for qator in f.- pickle:
dump/load,wb/rb, faqat Python. JSON: matnli, universal, API'lar tili. try/except/else/finally; aniq xato turini ushlang;tryqisqa bo'lsin.- Kiritish himoyasi qolipi:
while True+try+break.
Amaliyot
- "Rejalar" faylini
wbilan uch qator qilib yozing;abilan yana ikkitasini qo'shing; qatorma-qator raqamlab o'qing. - Talabalar lug'atlar ro'yxatini pickle bilan saqlab, qayta yuklang va asl bilan tengligini
==orqali tekshiring. - O'sha ro'yxatni JSON'ga yozing; faylni matn muharririda ochib, pickle faylidan farqini ko'ring.
- Foydalanuvchidan yoshini so'rang:
while True+try-exceptbilan to'g'ri son kiritilguncha qayta so'ralsin; 0 dan kichik qiymatga ham chek qo'ying. - Mavjud bo'lmagan faylni ochishda
FileNotFoundErrorushlab, o'rniga bo'sh fayl yaratadigan kod yozing. - (Qo'shimcha) Kichik "eslatmalar" dasturi: har ishga tushganda eski eslatmalarni JSON'dan yuklaydi, yangisini so'raydi, chiqishda saqlaydi.
Bo'lim testida fayllar va xatolar birga so'raladi.