11. Fayllar bilan ishlash¶
Dasturlarda ma’lumotlarni faqat dastur ishlayotgan vaqt davomida xotirada saqlash yetarli emas.
Ko‘pincha ma’lumotlarni faylga yozish va keyinchalik yana o‘qish kerak bo‘ladi.
Masalan:
foydalanuvchilar
mahsulotlar
sozlamalar
hisobotlar
jurnallar
rasmlar
JSON ma’lumotlar
CSV ma’lumotlar
Python fayllar bilan ishlash uchun juda qulay vositalarga ega.
Asosiy tushunchalar:
open()
read()
readline()
readlines()
write()
writelines()
with
CSV
JSON
Path
Fayl ochish¶
Python'da fayl bilan ishlash uchun open() funksiyasi ishlatiladi.
fayl = open(
"malumot.txt",
"r"
)
Bu yerda:
malumot.txt
→ fayl nomi
r
→ o‘qish rejimi
Fayl bilan ish tugagach, uni yopish kerak:
fayl.close()
Faylni o‘qish¶
fayl = open(
"malumot.txt",
"r"
)
matn = fayl.read()
print(
matn
)
fayl.close()
read() butun fayl tarkibini string sifatida qaytaradi.
with¶
Fayllar bilan ishlashda eng tavsiya qilinadigan usullardan biri withdan foydalanish.
with open(
"malumot.txt",
"r"
) as fayl:
matn = fayl.read()
print(
matn
)
with tugagach, fayl avtomatik yopiladi.
Shuning uchun:
fayl.close()
yozish shart emas.
Fayl rejimlari¶
open()ning ikkinchi parametri fayl rejimini belgilaydi.
Asosiy rejimlar:
r
w
a
x
b
t
r — o‘qish¶
with open(
"malumot.txt",
"r"
) as fayl:
matn = fayl.read()
print(
matn
)
Agar fayl mavjud bo‘lmasa, xatolik yuz beradi.
w — yozish¶
with open(
"malumot.txt",
"w"
) as fayl:
fayl.write(
"Salom, Softromeda!"
)
w rejimi faylni yozish uchun ochadi.
Agar fayl mavjud bo‘lsa, uning eski tarkibi o‘chiriladi.
a — oxiriga qo‘shish¶
with open(
"malumot.txt",
"a"
) as fayl:
fayl.write(
"\nYangi ma'lumot."
)
a rejimida mavjud ma’lumotlar saqlanadi va yangi ma’lumot oxiriga qo‘shiladi.
x — yangi fayl yaratish¶
with open(
"yangi_malumot.txt",
"x"
) as fayl:
fayl.write(
"Softromeda"
)
Agar fayl allaqachon mavjud bo‘lsa, xatolik yuz beradi.
read()¶
read() faylning ma’lum qismini yoki butun faylni o‘qishi mumkin.
with open(
"malumot.txt",
"r"
) as fayl:
matn = fayl.read(
10
)
print(
matn
)
Bu dastlabki 10 ta belgini o‘qiydi.
readline()¶
Bir qatorni o‘qish:
with open(
"malumot.txt",
"r"
) as fayl:
birinchi_qator = (
fayl.readline()
)
print(
birinchi_qator
)
Keyingi readline() keyingi qatorni o‘qiydi:
with open(
"malumot.txt",
"r"
) as fayl:
birinchi_qator = (
fayl.readline()
)
ikkinchi_qator = (
fayl.readline()
)
print(
birinchi_qator
)
print(
ikkinchi_qator
)
readlines()¶
Barcha qatorlarni list sifatida olish:
with open(
"malumot.txt",
"r"
) as fayl:
qatorlar = (
fayl.readlines()
)
print(
qatorlar
)
Masalan:
['Birinchi qator\n', 'Ikkinchi qator\n', 'Uchinchi qator\n']
Faylni for bilan o‘qish¶
Katta fayllar uchun faylni qatorlar bo‘yicha o‘qish qulay.
with open(
"malumot.txt",
"r"
) as fayl:
for qator in fayl:
print(
qator.strip()
)
Bu usul faylning barcha tarkibini birdan xotiraga yuklashdan ko‘ra foydaliroq bo‘lishi mumkin.
write()¶
Faylga string yozish:
with open(
"malumot.txt",
"w"
) as fayl:
fayl.write(
"Softromeda"
)
write() yozilgan belgilar sonini qaytaradi.
with open(
"malumot.txt",
"w"
) as fayl:
yozilgan_belgilar = (
fayl.write(
"Softromeda"
)
)
print(
f"Belgilar soni: {yozilgan_belgilar}"
)
Yangi qator yozish¶
write() avtomatik yangi qator yaratmaydi.
with open(
"malumot.txt",
"w"
) as fayl:
fayl.write(
"Birinchi qator\n"
)
fayl.write(
"Ikkinchi qator\n"
)
Natija:
Birinchi qator
Ikkinchi qator
writelines()¶
Bir nechta stringni yozish:
qatorlar = [
"Birinchi qator\n",
"Ikkinchi qator\n",
"Uchinchi qator\n"
]
with open(
"malumot.txt",
"w"
) as fayl:
fayl.writelines(
qatorlar
)
writelines() qatorlarga avtomatik \n qo‘shmaydi.
Shuning uchun qatorlarda \nni o‘zimiz yozdik.
Kodlash¶
O‘zbekcha belgilar bilan ishlaganda encodingni ko‘rsatish yaxshi amaliyot.
with open(
"malumot.txt",
"w",
encoding="utf-8"
) as fayl:
fayl.write(
"Salom, Softromeda!"
)
O‘qishda ham:
with open(
"malumot.txt",
"r",
encoding="utf-8"
) as fayl:
matn = fayl.read()
print(
matn
)
Fayl mavjudligini tekshirish¶
pathlib yordamida:
from pathlib import Path
fayl = Path(
"malumot.txt"
)
if fayl.exists():
print(
"Fayl mavjud."
)
else:
print(
"Fayl mavjud emas."
)
Fayl hajmini olish¶
from pathlib import Path
fayl = Path(
"malumot.txt"
)
if fayl.exists():
hajm = fayl.stat().st_size
print(
f"Fayl hajmi: {hajm} bayt"
)
Fayl nomi¶
from pathlib import Path
fayl = Path(
"malumot.txt"
)
print(
f"Fayl nomi: {fayl.name}"
)
Natija:
Fayl nomi: malumot.txt
Fayl kengaytmasi¶
from pathlib import Path
fayl = Path(
"malumot.txt"
)
print(
f"Kengaytma: {fayl.suffix}"
)
Natija:
Kengaytma: .txt
Papka yaratish¶
from pathlib import Path
papka = Path(
"malumotlar"
)
papka.mkdir(
exist_ok=True
)
print(
"Papka tayyor."
)
Ichki papkalar yaratish¶
from pathlib import Path
papka = Path(
"malumotlar/foydalanuvchilar"
)
papka.mkdir(
parents=True,
exist_ok=True
)
parents=True kerakli ota papkalarni ham yaratadi.
Faylga to‘liq yo‘l berish¶
from pathlib import Path
fayl = Path(
"malumotlar"
) / "foydalanuvchilar.txt"
with open(
fayl,
"w",
encoding="utf-8"
) as oqim:
oqim.write(
"Softromeda"
)
Path yordamida yo‘llarni birlashtirish platformaga mos ravishda amalga oshiriladi.
Faylni o‘chirish¶
from pathlib import Path
fayl = Path(
"malumot.txt"
)
if fayl.exists():
fayl.unlink()
print(
"Fayl o‘chirildi."
)
Papkani o‘chirish¶
Bo‘sh papkani:
from pathlib import Path
papka = Path(
"malumotlar"
)
if papka.exists():
papka.rmdir()
orqali o‘chirish mumkin.
Fayl xatoliklarini boshqarish¶
Fayl mavjud bo‘lmasligi mumkin.
try:
with open(
"mavjud_emas.txt",
"r",
encoding="utf-8"
) as fayl:
matn = fayl.read()
print(
matn
)
except FileNotFoundError:
print(
"Fayl topilmadi."
)
Fayl yozishda xatolik¶
try:
with open(
"malumot.txt",
"w",
encoding="utf-8"
) as fayl:
fayl.write(
"Softromeda"
)
except OSError as xatolik:
print(
f"Fayl bilan ishlashda xatolik: {xatolik}"
)
Matnli fayl bilan mini dastur¶
Foydalanuvchi ismini faylga yozamiz:
ism = input(
"Ismingizni kiriting: "
)
with open(
"foydalanuvchi.txt",
"w",
encoding="utf-8"
) as fayl:
fayl.write(
ism
)
print(
"Ma'lumot saqlandi."
)
Keyin uni o‘qiymiz:
with open(
"foydalanuvchi.txt",
"r",
encoding="utf-8"
) as fayl:
ism = fayl.read()
print(
f"Salom, {ism}!"
)
CSV¶
CSV — jadval ko‘rinishidagi ma’lumotlarni saqlash uchun ishlatiladigan oddiy format.
Masalan:
ism,yosh,kasb
Ali,25,Dasturchi
Vali,30,Muhandis
Python'da CSV bilan ishlash uchun csv moduli mavjud.
CSV yozish¶
import csv
foydalanuvchilar = [
["ism", "yosh", "kasb"],
["Ali", 25, "Dasturchi"],
["Vali", 30, "Muhandis"]
]
with open(
"foydalanuvchilar.csv",
"w",
newline="",
encoding="utf-8"
) as fayl:
yozuvchi = csv.writer(
fayl
)
yozuvchi.writerows(
foydalanuvchilar
)
CSV o‘qish¶
import csv
with open(
"foydalanuvchilar.csv",
"r",
newline="",
encoding="utf-8"
) as fayl:
oqiuvchi = csv.reader(
fayl
)
for qator in oqiuvchi:
print(
qator
)
Natija:
['ism', 'yosh', 'kasb']
['Ali', '25', 'Dasturchi']
['Vali', '30', 'Muhandis']
CSV dictionary bilan¶
CSV ustunlarini kalit sifatida olish uchun DictReader ishlatiladi.
import csv
with open(
"foydalanuvchilar.csv",
"r",
newline="",
encoding="utf-8"
) as fayl:
oqiuvchi = csv.DictReader(
fayl
)
for foydalanuvchi in oqiuvchi:
print(
f"Ism: {foydalanuvchi['ism']}"
)
print(
f"Yosh: {foydalanuvchi['yosh']}"
)
print(
f"Kasb: {foydalanuvchi['kasb']}"
)
CSV dictionary yozish¶
import csv
foydalanuvchilar = [
{
"ism": "Ali",
"yosh": 25,
"kasb": "Dasturchi"
},
{
"ism": "Vali",
"yosh": 30,
"kasb": "Muhandis"
}
]
with open(
"foydalanuvchilar.csv",
"w",
newline="",
encoding="utf-8"
) as fayl:
ustunlar = [
"ism",
"yosh",
"kasb"
]
yozuvchi = csv.DictWriter(
fayl,
fieldnames=ustunlar
)
yozuvchi.writeheader()
yozuvchi.writerows(
foydalanuvchilar
)
JSON¶
JSON zamonaviy dasturlarda ma’lumot almashish uchun juda keng ishlatiladi.
Masalan:
{
"ism": "Softromeda",
"yosh": 25,
"kasb": "Dasturchi"
}
Python'da JSON bilan ishlash uchun json moduli mavjud.
Dictionarydan JSON olish¶
import json
foydalanuvchi = {
"ism": "Softromeda",
"yosh": 25,
"kasb": "Dasturchi"
}
matn = json.dumps(
foydalanuvchi,
ensure_ascii=False,
indent=4
)
print(
matn
)
Natija:
{
"ism": "Softromeda",
"yosh": 25,
"kasb": "Dasturchi"
}
JSONni faylga yozish¶
import json
foydalanuvchi = {
"ism": "Softromeda",
"yosh": 25,
"kasb": "Dasturchi"
}
with open(
"foydalanuvchi.json",
"w",
encoding="utf-8"
) as fayl:
json.dump(
foydalanuvchi,
fayl,
ensure_ascii=False,
indent=4
)
JSON faylni o‘qish¶
import json
with open(
"foydalanuvchi.json",
"r",
encoding="utf-8"
) as fayl:
foydalanuvchi = json.load(
fayl
)
print(
foydalanuvchi
)
JSON stringni Python obyektiga aylantirish¶
import json
matn = """
{
"ism": "Softromeda",
"yosh": 25
}
"""
foydalanuvchi = json.loads(
matn
)
print(
foydalanuvchi["ism"]
)
Natija:
Softromeda
Python obyektini JSON stringga aylantirish¶
import json
foydalanuvchi = {
"ism": "Softromeda",
"yosh": 25
}
matn = json.dumps(
foydalanuvchi,
ensure_ascii=False
)
print(
matn
)
dump() va dumps()¶
Farq juda oddiy:
dump()
→ JSONni faylga yozadi
dumps()
→ JSONni string sifatida qaytaradi
Xuddi shunday:
load()
→ JSONni fayldan o‘qiydi
loads()
→ JSON stringni o‘qiydi
JSON xatoliklarini boshqarish¶
JSON noto‘g‘ri formatda bo‘lishi mumkin.
import json
matn = """
{
"ism": "Softromeda",
"yosh":
}
"""
try:
malumot = json.loads(
matn
)
except json.JSONDecodeError:
print(
"JSON formati noto‘g‘ri."
)
JSON ichida list¶
import json
foydalanuvchilar = [
{
"ism": "Ali",
"yosh": 25
},
{
"ism": "Vali",
"yosh": 30
}
]
with open(
"foydalanuvchilar.json",
"w",
encoding="utf-8"
) as fayl:
json.dump(
foydalanuvchilar,
fayl,
ensure_ascii=False,
indent=4
)
JSON murakkab tuzilma¶
JSON ichida dictionary va listlarni birlashtirish mumkin.
dastur = {
"nomi": "Softromeda",
"versiya": 1,
"foydalanuvchilar": [
{
"ism": "Ali",
"yosh": 25
},
{
"ism": "Vali",
"yosh": 30
}
]
}
Bu real dasturlarda juda ko‘p uchraydi.
Faylga ma’lumot qo‘shib borish¶
Masalan, jurnal fayli:
xabar = input(
"Xabar kiriting: "
)
with open(
"jurnal.txt",
"a",
encoding="utf-8"
) as fayl:
fayl.write(
xabar + "\n"
)
print(
"Xabar jurnalga saqlandi."
)
Har safar dastur ishga tushirilganda yangi xabar fayl oxiriga qo‘shiladi.
Fayldagi so‘zlar sonini hisoblash¶
with open(
"malumot.txt",
"r",
encoding="utf-8"
) as fayl:
matn = fayl.read()
sozlar = matn.split()
print(
f"So‘zlar soni: {len(sozlar)}"
)
Fayldagi qatorlar sonini hisoblash¶
with open(
"malumot.txt",
"r",
encoding="utf-8"
) as fayl:
qatorlar = fayl.readlines()
print(
f"Qatorlar soni: {len(qatorlar)}"
)
Fayldagi belgilar sonini hisoblash¶
with open(
"malumot.txt",
"r",
encoding="utf-8"
) as fayl:
matn = fayl.read()
print(
f"Belgilar soni: {len(matn)}"
)
Faylni boshqa nomga o‘zgartirish¶
Path.rename() yordamida:
from pathlib import Path
eski_fayl = Path(
"eski.txt"
)
yangi_fayl = Path(
"yangi.txt"
)
if eski_fayl.exists():
eski_fayl.rename(
yangi_fayl
)
print(
"Fayl nomi o‘zgartirildi."
)
Faylni nusxalash¶
Buning uchun shutil modulidan foydalanish mumkin.
import shutil
shutil.copy(
"manba.txt",
"nusxa.txt"
)
print(
"Fayl nusxalandi."
)
Faylni ko‘chirish¶
import shutil
shutil.move(
"manba.txt",
"malumotlar/manba.txt"
)
print(
"Fayl ko‘chirildi."
)
Katalog tarkibini ko‘rish¶
Path.iterdir() yordamida:
from pathlib import Path
papka = Path(
"."
)
for element in papka.iterdir():
print(
element
)
Faqat .txt fayllarini topish¶
from pathlib import Path
papka = Path(
"."
)
for fayl in papka.glob(
"*.txt"
):
print(
fayl
)
Ichki papkalardan ham qidirish¶
from pathlib import Path
papka = Path(
"."
)
for fayl in papka.rglob(
"*.txt"
):
print(
fayl
)
Fayllar bilan xavfsiz ishlash¶
Faylni o‘chirish yoki ustiga yozishdan oldin mavjudligini tekshirish yaxshi amaliyot:
from pathlib import Path
fayl = Path(
"malumot.txt"
)
if fayl.exists():
fayl.unlink()
print(
"Fayl o‘chirildi."
)
else:
print(
"O‘chiriladigan fayl topilmadi."
)
Amaliy mashqlar¶
Mashq 1¶
malumot.txt fayliga uchta qator yozing.
Mashq 2¶
Faylni o‘qib, barcha qatorlarni chiqaring.
Mashq 3¶
Fayldagi qatorlar sonini hisoblang.
Mashq 4¶
Fayldagi so‘zlar sonini hisoblang.
Mashq 5¶
Foydalanuvchi ismlarini CSV faylga saqlang.
Mashq 6¶
CSV fayldan foydalanuvchilarni o‘qing.
Mashq 7¶
Foydalanuvchi ma’lumotlarini JSON faylga saqlang.
Mashq 8¶
JSON fayldan foydalanuvchi ma’lumotlarini o‘qing.
Mashq 9¶
pathlib yordamida barcha .txt fayllarni toping.
Mashq 10¶
Fayl mavjud bo‘lmasa, FileNotFoundErrorni boshqaring.
Mini loyiha — Softromeda foydalanuvchilar bazasi¶
Foydalanuvchilarni JSON faylda saqlaydigan kichik dastur yaratamiz.
import json
from pathlib import Path
fayl_yoli = Path(
"foydalanuvchilar.json"
)
def foydalanuvchilarni_oqish():
if not fayl_yoli.exists():
return []
try:
with open(
fayl_yoli,
"r",
encoding="utf-8"
) as fayl:
return json.load(
fayl
)
except json.JSONDecodeError:
print(
"JSON fayli buzilgan."
)
return []
def foydalanuvchilarni_saqlash(
foydalanuvchilar
):
with open(
fayl_yoli,
"w",
encoding="utf-8"
) as fayl:
json.dump(
foydalanuvchilar,
fayl,
ensure_ascii=False,
indent=4
)
def foydalanuvchi_qoshish():
ism = input(
"Ismni kiriting: "
)
yosh = int(
input("Yoshni kiriting: ")
)
foydalanuvchi = {
"ism": ism,
"yosh": yosh
}
foydalanuvchilar = (
foydalanuvchilarni_oqish()
)
foydalanuvchilar.append(
foydalanuvchi
)
foydalanuvchilarni_saqlash(
foydalanuvchilar
)
print(
"Foydalanuvchi saqlandi."
)
def foydalanuvchilarni_korsatish():
foydalanuvchilar = (
foydalanuvchilarni_oqish()
)
if not foydalanuvchilar:
print(
"Foydalanuvchilar mavjud emas."
)
return
print(
"\n=== Softromeda foydalanuvchilari ==="
)
for tartib, foydalanuvchi in enumerate(
foydalanuvchilar,
start=1
):
print(
f"{tartib}. "
f"{foydalanuvchi['ism']} - "
f"{foydalanuvchi['yosh']} yosh"
)
while True:
print(
"\n=== Softromeda ==="
)
print(
"1. Foydalanuvchi qo‘shish"
)
print(
"2. Foydalanuvchilarni ko‘rish"
)
print(
"3. Chiqish"
)
tanlov = input(
"Tanlovingiz: "
)
try:
if tanlov == "1":
foydalanuvchi_qoshish()
elif tanlov == "2":
foydalanuvchilarni_korsatish()
elif tanlov == "3":
print(
"Dastur yakunlandi."
)
break
else:
print(
"Noto‘g‘ri tanlov."
)
except ValueError:
print(
"Yoshni raqam bilan kiriting."
)
Bu loyihada bir nechta muhim tushuncha birlashdi:
Path
JSON
list
dictionary
funksiya
try
except
fayl o‘qish
fayl yozish
foydalanuvchi kiritmasi
Bob xulosasi¶
Bu bobda fayllar bilan ishlashni o‘rgandik.
Asosiy fayl operatsiyalari:
open()
read()
readline()
readlines()
write()
writelines()
close()
Fayl rejimlari:
r
w
a
x
Xavfsiz ishlash:
with open(...) as fayl:
...
Yo‘llar bilan ishlash:
Path
exists()
mkdir()
unlink()
rename()
glob()
rglob()
Ma’lumot formatlari:
TXT
CSV
JSON
JSON bilan ishlash:
json.dump()
json.dumps()
json.load()
json.loads()
CSV bilan ishlash:
csv.reader
csv.writer
csv.DictReader
csv.DictWriter
Fayllar dasturga ma’lumotlarni dastur yopilgandan keyin ham saqlab qolish imkonini beradi.
Keyingi bobda Python'da obyektga yo‘naltirilgan dasturlash — class, obyekt, konstruktor, metod, meros olish va polimorfizmni o‘rganamiz.