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.