16. JSON, CSV va ma’lumotlar bilan ishlash

Dasturlashda ma’lumotlarni fayllarda saqlash va boshqa dasturlar bilan almashish juda muhim.

Amaliy dasturlarda ma’lumotlar ko‘pincha:

JSON
CSV
matnli fayllar
ma’lumotlar bazalari
API javoblari

ko‘rinishida uchraydi.

Python JSON va CSV bilan ishlash uchun kerakli vositalarni standart kutubxonada taqdim etadi.

Bu bobda:

  • JSON nima?
  • json.loads()
  • json.dumps()
  • json.load()
  • json.dump()
  • CSV nima?
  • csv.reader
  • csv.DictReader
  • ma’lumotlarni qayta ishlash

mavzularini o‘rganamiz.


JSON nima?

JSON — JavaScript Object Notation so‘zlarining qisqartmasi.

JSON dasturlar orasida ma’lumot almashish uchun keng ishlatiladigan formatdir.

Masalan:

{
    "ism": "Ali",
    "yosh": 25,
    "dasturchi": true
}

JSON quyidagi ma’lumotlarni saqlashi mumkin:

matn
son
mantiqiy qiymat
ro‘yxat
obyekt
null

JSON va Python

JSON strukturasi Python ma’lumot tuzilmalariga juda o‘xshaydi.

JSON:

{
    "ism": "Ali",
    "yosh": 25
}

Python:

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 25
}

Lekin ular aynan bir xil format emas.

Python'dagi:

True
False
None

JSON'da:

true
false
null

ko‘rinishida yoziladi.


json modulini import qilish

Python'da JSON bilan ishlash uchun:

import json

deb yozamiz.


json.loads()

json.loads() JSON formatidagi matnni Python obyektiga aylantiradi.

import json

matn = """
{
    "ism": "Ali",
    "yosh": 25,
    "dasturchi": true
}
"""

foydalanuvchi = json.loads(
    matn
)

print(
    f"Ism: {foydalanuvchi['ism']}"
)

print(
    f"Yosh: {foydalanuvchi['yosh']}"
)

print(
    f"Dasturchi: {foydalanuvchi['dasturchi']}"
)

Natija:

Ism: Ali
Yosh: 25
Dasturchi: True

loads() nomidagi s

Bu yerda s:

string

ma’nosini bildiradi.

Shuning uchun:

json.loads()

JSON matni bilan ishlaydi.


JSON massivini o‘qish

JSON ro‘yxat ham saqlashi mumkin.

import json

matn = """
[
    "Python",
    "Java",
    "C++"
]
"""

tillar = json.loads(
    matn
)

for til in tillar:

    print(
        f"Dasturlash tili: {til}"
    )

Natija:

Dasturlash tili: Python
Dasturlash tili: Java
Dasturlash tili: C++

JSON ichida obyektlar ro‘yxati

import json

matn = """
[
    {
        "ism": "Ali",
        "yosh": 25
    },
    {
        "ism": "Vali",
        "yosh": 30
    },
    {
        "ism": "Sami",
        "yosh": 22
    }
]
"""

foydalanuvchilar = json.loads(
    matn
)

for foydalanuvchi in foydalanuvchilar:

    print(
        f"{foydalanuvchi['ism']} - "
        f"{foydalanuvchi['yosh']} yosh"
    )

json.dumps()

json.dumps() Python obyektini JSON matniga aylantiradi.

import json

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 25,
    "dasturchi": True
}

matn = json.dumps(
    foydalanuvchi
)

print(
    matn
)

Natija:

{"ism": "Ali", "yosh": 25, "dasturchi": true}

dumps() nomidagi s

Bu yerdagi s ham:

string

ma’nosini bildiradi.

Shuning uchun:

json.dumps()

JSON matnini qaytaradi.


loads() va dumps() farqi

json.loads()
    JSON matni → Python obyekti

json.dumps()
    Python obyekti → JSON matni

Masalan:

import json

asl_matn = '{"ism": "Ali", "yosh": 25}'

obyekt = json.loads(
    asl_matn
)

yangi_matn = json.dumps(
    obyekt
)

print(
    f"Python obyekti: {obyekt}"
)

print(
    f"JSON matni: {yangi_matn}"
)

indent

json.dumps() yordamida JSON'ni chiroyli formatda chiqarish mumkin.

import json

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 25,
    "dasturchi": True
}

matn = json.dumps(
    foydalanuvchi,
    indent=4
)

print(
    matn
)

Natija:

{
    "ism": "Ali",
    "yosh": 25,
    "dasturchi": true
}

ensure_ascii

O‘zbekcha yoki boshqa Unicode belgilar bilan ishlaganda ensure_ascii=False foydali.

import json

foydalanuvchi = {
    "ism": "G‘ayrat",
    "shahar": "Toshkent"
}

matn = json.dumps(
    foydalanuvchi,
    ensure_ascii=False,
    indent=4
)

print(
    matn
)

Natija:

{
    "ism": "G‘ayrat",
    "shahar": "Toshkent"
}

JSON fayl

JSON ma’lumotlarini faylga saqlash mumkin.

Masalan:

foydalanuvchi.json

fayli:

{
    "ism": "Ali",
    "yosh": 25,
    "dasturchi": true
}

json.load()

json.load() JSON faylini o‘qib, Python obyektiga aylantiradi.

import json

with open(
    "foydalanuvchi.json",
    "r",
    encoding="utf-8"
) as fayl:

    foydalanuvchi = json.load(
        fayl
    )

print(
    f"Ism: {foydalanuvchi['ism']}"
)

print(
    f"Yosh: {foydalanuvchi['yosh']}"
)

json.dump()

json.dump() Python obyektini JSON fayliga yozadi.

import json

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 25,
    "dasturchi": True
}

with open(
    "foydalanuvchi.json",
    "w",
    encoding="utf-8"
) as fayl:

    json.dump(
        foydalanuvchi,
        fayl,
        ensure_ascii=False,
        indent=4
    )

load() va dump() farqi

json.load()
    JSON fayl → Python obyekti

json.dump()
    Python obyekti → JSON fayl

loads() va dumps() esa matn bilan ishlaydi.

loads()
    JSON matni → Python

dumps()
    Python → JSON matni

JSON bilan to‘liq misol

import json


foydalanuvchilar = [
    {
        "ism": "Ali",
        "yosh": 25
    },
    {
        "ism": "Vali",
        "yosh": 30
    },
    {
        "ism": "Sami",
        "yosh": 22
    }
]


with open(
    "foydalanuvchilar.json",
    "w",
    encoding="utf-8"
) as fayl:

    json.dump(
        foydalanuvchilar,
        fayl,
        ensure_ascii=False,
        indent=4
    )


with open(
    "foydalanuvchilar.json",
    "r",
    encoding="utf-8"
) as fayl:

    qayta_oqilgan_foydalanuvchilar = json.load(
        fayl
    )


for foydalanuvchi in qayta_oqilgan_foydalanuvchilar:

    print(
        f"{foydalanuvchi['ism']} - "
        f"{foydalanuvchi['yosh']} yosh"
    )

CSV

CSV — Comma-Separated Values so‘zlarining qisqartmasi.

CSV jadval ko‘rinishidagi ma’lumotlarni saqlash uchun ishlatiladi.

Masalan:

ism,yosh,shahar
Ali,25,Toshkent
Vali,30,Samarqand
Sami,22,Buxoro

Birinchi qator odatda ustun nomlarini bildiradi.


CSV moduli

Python'da CSV bilan ishlash uchun:

import csv

ishlatiladi.


csv.reader

csv.reader CSV faylini qatorlar bo‘yicha o‘qishga yordam beradi.

Masalan:

foydalanuvchilar.csv

fayli:

ism,yosh,shahar
Ali,25,Toshkent
Vali,30,Samarqand
Sami,22,Buxoro

Uni o‘qish:

import csv

with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.reader(
        fayl
    )

    for qator in oqish:

        print(
            qator
        )

Natija:

['ism', 'yosh', 'shahar']
['Ali', '25', 'Toshkent']
['Vali', '30', 'Samarqand']
['Sami', '22', 'Buxoro']

CSV sarlavhasini ajratish

import csv

with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.reader(
        fayl
    )

    sarlavha = next(
        oqish
    )

    print(
        f"Sarlavha: {sarlavha}"
    )

    for qator in oqish:

        print(
            f"Ma'lumot: {qator}"
        )

csv.writer

CSV fayliga ma’lumot yozish uchun csv.writer ishlatiladi.

import csv

foydalanuvchilar = [
    ["Ali", 25, "Toshkent"],
    ["Vali", 30, "Samarqand"],
    ["Sami", 22, "Buxoro"]
]

with open(
    "foydalanuvchilar.csv",
    "w",
    encoding="utf-8",
    newline=""
) as fayl:

    yozish = csv.writer(
        fayl
    )

    yozish.writerow(
        [
            "ism",
            "yosh",
            "shahar"
        ]
    )

    yozish.writerows(
        foydalanuvchilar
    )

writerow()

Bitta qator yozadi:

yozish.writerow(
    [
        "Ali",
        25,
        "Toshkent"
    ]
)

writerows()

Bir nechta qatorni yozadi:

yozish.writerows(
    [
        ["Ali", 25],
        ["Vali", 30],
        ["Sami", 22]
    ]
)

csv.DictReader

CSV faylida ustunlar bilan nom orqali ishlash uchun DictReader juda qulay.

import csv

with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.DictReader(
        fayl
    )

    for foydalanuvchi in oqish:

        print(
            f"Ism: {foydalanuvchi['ism']}"
        )

        print(
            f"Yosh: {foydalanuvchi['yosh']}"
        )

        print(
            f"Shahar: {foydalanuvchi['shahar']}"
        )

DictReader nima uchun qulay?

csv.reader:

qator[0]
qator[1]
qator[2]

ko‘rinishida ishlaydi.

DictReader esa:

foydalanuvchi["ism"]
foydalanuvchi["yosh"]
foydalanuvchi["shahar"]

ko‘rinishida ishlaydi.

Bu katta CSV fayllarda kodni tushunarli qiladi.


csv.DictWriter

Lug‘atlarni CSV fayliga yozish uchun DictWriter ishlatiladi.

import csv

foydalanuvchilar = [
    {
        "ism": "Ali",
        "yosh": 25,
        "shahar": "Toshkent"
    },
    {
        "ism": "Vali",
        "yosh": 30,
        "shahar": "Samarqand"
    },
    {
        "ism": "Sami",
        "yosh": 22,
        "shahar": "Buxoro"
    }
]

ustunlar = [
    "ism",
    "yosh",
    "shahar"
]

with open(
    "foydalanuvchilar.csv",
    "w",
    encoding="utf-8",
    newline=""
) as fayl:

    yozish = csv.DictWriter(
        fayl,
        fieldnames=ustunlar
    )

    yozish.writeheader()

    yozish.writerows(
        foydalanuvchilar
    )

CSV qiymatlari matn bo‘lishi

CSV faylidan o‘qilgan qiymatlar odatda matn sifatida keladi.

Masalan:

import csv

with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.DictReader(
        fayl
    )

    for foydalanuvchi in oqish:

        yosh = int(
            foydalanuvchi["yosh"]
        )

        print(
            f"{foydalanuvchi['ism']} "
            f"{yosh} yoshda."
        )

Bu yerda:

foydalanuvchi["yosh"]

avval matn bo‘ladi.

Shuning uchun:

int(...)

orqali songa aylantirdik.


JSON va CSV farqi

JSON:

{
    "ism": "Ali",
    "yosh": 25,
    "ko'nikmalar": [
        "Python",
        "SQL"
    ]
}

CSV:

ism,yosh
Ali,25

JSON murakkabroq ichki strukturani saqlashga qulay.

CSV esa jadval ko‘rinishidagi ma’lumotlar uchun qulay.


Qachon JSON ishlatish kerak?

JSON quyidagi holatlarda juda foydali:

API
konfiguratsiya
murakkab obyektlar
ichma-ich ma’lumotlar
dasturlar orasida ma’lumot almashish

Masalan:

{
    "foydalanuvchi": {
        "ism": "Ali",
        "aloqa": {
            "email": "[email protected]"
        }
    }
}

Qachon CSV ishlatish kerak?

CSV quyidagi holatlarda qulay:

jadval ma’lumotlari
Excel bilan ishlash
hisobotlar
oddiy ma’lumotlar eksporti
katta satrli ma’lumotlar

Masalan:

ism,yosh,baho
Ali,25,90
Vali,30,85
Sami,22,95

JSON ma’lumotlarini qayta ishlash

JSON'dan o‘qilgan ma’lumot oddiy Python obyektiga aylangani uchun u bilan odatdagi Python kodlari orqali ishlash mumkin.

import json

matn = """
[
    {
        "ism": "Ali",
        "yosh": 25
    },
    {
        "ism": "Vali",
        "yosh": 30
    },
    {
        "ism": "Sami",
        "yosh": 22
    }
]
"""

foydalanuvchilar = json.loads(
    matn
)

voyaga_yetganlar = [
    foydalanuvchi
    for foydalanuvchi in foydalanuvchilar
    if foydalanuvchi["yosh"] >= 25
]

for foydalanuvchi in voyaga_yetganlar:

    print(
        f"{foydalanuvchi['ism']} - "
        f"{foydalanuvchi['yosh']} yosh"
    )

JSON ma’lumotlarini o‘zgartirish

import json

matn = """
{
    "ism": "Ali",
    "yosh": 25
}
"""

foydalanuvchi = json.loads(
    matn
)

foydalanuvchi["yosh"] = 26

foydalanuvchi["shahar"] = "Toshkent"

yangi_matn = json.dumps(
    foydalanuvchi,
    ensure_ascii=False,
    indent=4
)

print(
    yangi_matn
)

CSV ma’lumotlarini filtrlash

import csv

with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.DictReader(
        fayl
    )

    for foydalanuvchi in oqish:

        yosh = int(
            foydalanuvchi["yosh"]
        )

        if yosh >= 25:

            print(
                f"{foydalanuvchi['ism']} "
                f"mos keldi."
            )

CSV ma’lumotlarini hisoblash

Masalan, mahsulotlar:

nom,narx
Noutbuk,800
Telefon,500
Monitor,300

Ularning umumiy narxini hisoblash:

import csv

umumiy_narx = 0

with open(
    "mahsulotlar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.DictReader(
        fayl
    )

    for mahsulot in oqish:

        narx = float(
            mahsulot["narx"]
        )

        umumiy_narx += narx


print(
    f"Umumiy narx: {umumiy_narx}"
)

JSON va CSV o‘rtasida konvertatsiya

CSV ma’lumotlarini JSON formatiga aylantirish mumkin.

import csv
import json


foydalanuvchilar = []

with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.DictReader(
        fayl
    )

    for qator in oqish:

        foydalanuvchilar.append(
            {
                "ism": qator["ism"],
                "yosh": int(qator["yosh"]),
                "shahar": qator["shahar"]
            }
        )


with open(
    "foydalanuvchilar.json",
    "w",
    encoding="utf-8"
) as fayl:

    json.dump(
        foydalanuvchilar,
        fayl,
        ensure_ascii=False,
        indent=4
    )


print(
    "CSV ma'lumotlari JSON fayliga aylantirildi."
)

Amaliy loyiha — Softromeda ma’lumotlar konvertori

Endi CSV faylidan foydalanuvchilarni o‘qib, ularni JSON fayliga saqlaydigan kichik loyiha yaratamiz.

CSV:

ism,yosh,kasb
Ali,25,Dasturchi
Vali,30,Dizayner
Sami,22,Tahlilchi

Python dasturi:

import csv
import json


foydalanuvchilar = []


with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.DictReader(
        fayl
    )

    for qator in oqish:

        foydalanuvchi = {
            "ism": qator["ism"],
            "yosh": int(qator["yosh"]),
            "kasb": qator["kasb"]
        }

        foydalanuvchilar.append(
            foydalanuvchi
        )


with open(
    "foydalanuvchilar.json",
    "w",
    encoding="utf-8"
) as fayl:

    json.dump(
        foydalanuvchilar,
        fayl,
        ensure_ascii=False,
        indent=4
    )


print(
    f"{len(foydalanuvchilar)} ta "
    "foydalanuvchi JSON fayliga saqlandi."
)

Natijada:

foydalanuvchilar.json

fayli yaratiladi.

Uning ichida:

[
    {
        "ism": "Ali",
        "yosh": 25,
        "kasb": "Dasturchi"
    },
    {
        "ism": "Vali",
        "yosh": 30,
        "kasb": "Dizayner"
    },
    {
        "ism": "Sami",
        "yosh": 22,
        "kasb": "Tahlilchi"
    }
]

ko‘rinishidagi ma’lumot bo‘ladi.


Ma’lumotlarni tekshirish

Tashqi fayldan ma’lumot o‘qiyotganda ma’lumotlar har doim to‘g‘ri bo‘ladi deb hisoblash mumkin emas.

Masalan:

ism,yosh
Ali,25
Vali,yigirma
Sami,22

Bu yerda:

yigirma

son emas.

Shuning uchun ma’lumotni tekshirish kerak.

import csv

with open(
    "foydalanuvchilar.csv",
    "r",
    encoding="utf-8"
) as fayl:

    oqish = csv.DictReader(
        fayl
    )

    for qator in oqish:

        try:

            yosh = int(
                qator["yosh"]
            )

        except ValueError:

            print(
                f"Noto‘g‘ri yosh: "
                f"{qator['yosh']}"
            )

            continue

        print(
            f"{qator['ism']} - "
            f"{yosh} yosh"
        )

JSON xatolarini boshqarish

Noto‘g‘ri JSON o‘qilganda JSONDecodeError yuz berishi mumkin.

import json

matn = """
{
    "ism": "Ali",
    "yosh": 25,
}
"""

try:

    foydalanuvchi = json.loads(
        matn
    )

except json.JSONDecodeError:

    print(
        "JSON ma'lumotlari noto'g'ri."
    )

Fayl kodlashini ko‘rsatish

O‘zbekcha matn bilan ishlaganda:

encoding="utf-8"

dan foydalanish muhim.

Masalan:

with open(
    "ma'lumotlar.json",
    "r",
    encoding="utf-8"
) as fayl:

    ma'lumotlar = json.load(
        fayl
    )

JSON yozishda ham:

json.dump(
    ma'lumotlar,
    fayl,
    ensure_ascii=False,
    indent=4
)

ishlatish mumkin.


Amaliy mashqlar

Mashq 1

Quyidagi Python lug‘atini JSON matniga aylantiring:

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 25,
    "shahar": "Toshkent"
}

Mashq 2

JSON matnini json.loads() yordamida Python obyektiga aylantiring.

Mashq 3

Python ro‘yxatini JSON fayliga json.dump() yordamida yozing.

Mashq 4

JSON faylini json.load() yordamida o‘qing.

Mashq 5

CSV fayliga csv.writer yordamida 5 ta foydalanuvchi yozing.

Mashq 6

CSV faylini csv.reader yordamida o‘qing.

Mashq 7

csv.DictReader yordamida foydalanuvchilarni ism bo‘yicha chiqaring.

Mashq 8

CSV faylidagi barcha yoshlarning o‘rtacha qiymatini hisoblang.

Mashq 9

CSV faylidagi ma’lumotlarni JSON fayliga aylantiring.

Mashq 10

Softromeda uchun ma’lumotlarni boshqaruvchi dastur yarating. Dastur:

CSV faylini o‘qisin
ma’lumotlarni tekshirsin
faqat to‘g‘ri ma’lumotlarni qabul qilsin
JSON fayliga saqlasin
nechta ma’lumot qayta ishlanganini ko‘rsatsin

Bob xulosasi

Bu bobda ma’lumotlarni JSON va CSV formatlarida saqlash hamda qayta ishlashni o‘rgandik.

JSON bilan ishlash:

json.loads()
json.dumps()
json.load()
json.dump()

CSV bilan ishlash:

csv.reader()
csv.writer()
csv.DictReader()
csv.DictWriter()

Asosiy farq:

loads()
    JSON matni → Python

dumps()
    Python → JSON matni

load()
    JSON fayl → Python

dump()
    Python → JSON fayl

CSV esa asosan jadval ko‘rinishidagi ma’lumotlar bilan ishlash uchun qulay.

Eng muhim amaliy ko‘nikma — tashqi ma’lumotlarni shunchaki o‘qish emas, balki:

o‘qish
tekshirish
o‘zgartirish
filtrlash
hisoblash
saqlash
konvertatsiya qilish

jarayonlarini to‘g‘ri tashkil qilishdir.

Keyingi bobda 17. SQLite va ma’lumotlar bazasi mavzusini o‘rganamiz.