Məzmuna keç
Educora
İrəli20 dəq25 / 42

JSON və CSV ilə işləmək

`json` modulu ilə verilənləri mətnə çevir və geri oxu, Azərbaycan hərflərini `ensure_ascii=False` ilə qoru, `csv` modulu ilə cədvəlləri düzgün oxu və yaz, `pathlib` ilə fayllarla işlə.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • json.dumps, json.loads, json.dump, json.load ilə Python obyektlərini JSON-a çevirmək və geri almaq
  • CSV-ni csv.reader və csv.DictReader ilə oxumaq, csv.writer və DictWriter ilə yazmaq
  • pathlib.Path ilə yolları qurmaq, faylları oxumaq və yazmaq

Hazırda oxuduğun bu dərs də bir JSON faylıdır: sayt və mobil tətbiqlər onu eyni fayldan götürür. Proqramlar bir-biri ilə məlumat mübadiləsini əsasən iki mətn formatında aparır: JSON — veb servislərin, parametr fayllarının və API-lərin dili, CSV — Excel-dən, bank çıxarışlarından və hesabatlardan gələn cədvəllər. Hər ikisi üçün Python-un standart kitabxanasında hazır modullar var.

JSON: mətn şəklində verilənlər

JSON (JavaScript Object Notation) Python lüğətlərinə və siyahılarına çox bənzəyir, amma bir neçə fərqi var: sətirlər yalnız qoşa dırnaqla yazılır, True əvəzinə true, None əvəzinə null işlənir, obyektin açarları isə həmişə sətirdir. json.dumps Python obyektini JSON sətrinə çevirir (serializasiya), json.loads isə əksinə.

PythonJSON
dictobyekt {...}
list, tuplemassiv [...]
strsətir (qoşa dırnaqda)
int, floatədəd
True, False, Nonetrue, false, null
Python
import json

student = {'name': 'Aysel', 'city': 'Bakı', 'age': 19,
           'grades': [5, 4, 5], 'active': True, 'mentor': None}
text = json.dumps(student)
print(text)
print(json.dumps(student, ensure_ascii=False))
back = json.loads(text)
print(back == student, type(back['grades']).__name__)
print(json.dumps({'city': 'Gəncə', 'grades': [5, 4]}, ensure_ascii=False, indent=2))
▸ Gözlənilən nəticə
{"name": "Aysel", "city": "Bak\u0131", "age": 19, "grades": [5, 4, 5], "active": true, "mentor": null}
{"name": "Aysel", "city": "Bakı", "age": 19, "grades": [5, 4, 5], "active": true, "mentor": null}
True list
{
  "city": "Gəncə",
  "grades": [
    5,
    4
  ]
}
Python
import json
from datetime import date

data = {1: 'one', 'point': (3, 4)}
text = json.dumps(data)
print(text)
print(json.loads(text))
try:
    json.dumps({'when': date(2026, 9, 1)})
except TypeError as e:
    print('TypeError:', e)
print(json.dumps({'when': date(2026, 9, 1)}, default=str))
▸ Gözlənilən nəticə
{"1": "one", "point": [3, 4]}
{'1': 'one', 'point': [3, 4]}
TypeError: Object of type date is not JSON serializable
{"when": "2026-09-01"}

pathlib və JSON faylları

pathlib.Path fayl yolunu obyekt kimi təsvir edir: yolları / ilə birləşdirmək olar (Path('data') / 'report.json'), read_text və write_text faylı bir sətirlə oxuyub-yazır, name, stem, suffix adın hissələrini, exists() isə faylın olub-olmadığını qaytarır. Kod Windows, macOS və Linux-da eyni işləyir. Açıq fayl obyektləri üçün json.dump və json.load var.

Python
import json
from pathlib import Path

settings = {'language': 'az', 'theme': 'dark', 'subjects': ['python', 'math']}
path = Path('settings.json')
path.write_text(json.dumps(settings, indent=2), encoding='utf-8')
loaded = json.loads(path.read_text(encoding='utf-8'))
print(loaded['subjects'])

with open(path, 'w', encoding='utf-8') as f:
    json.dump(settings, f, ensure_ascii=False)
with open(path, encoding='utf-8') as f:
    print(json.load(f) == settings)
print(path.name, path.stem, path.suffix, path.exists())
▸ Gözlənilən nəticə
['python', 'math']
True
settings.json settings .json True
Yadda saxla: dumps / loads sətirlə, dump / load isə faylla işləyir (sonundakı «s» — string).

CSV: csv modulu ilə cədvəllər

CSV sadə görünür, amma dırnaqlar içində vergül, sətir keçidi və ya dırnağın özü ola bilər. csv modulu bu qaydaları bilir. csv.reader hər sətri siyahı kimi, csv.DictReader isə başlıq sətrindəki adlarla lüğət kimi qaytarır. Bütün qiymətlər sətirdir — ədədə özün çevir.

Python
import csv
import io

text = '''name,city,score
Aysel,Bakı,91
Murad,"Gəncə, Azerbaijan",76
Leyla,Sumqayıt,85'''
for row in csv.reader(io.StringIO(text)):
    print(row)
rows = list(csv.DictReader(io.StringIO(text)))
print(rows[1]['city'], '|', type(rows[1]['score']).__name__)
avg = sum(int(r['score']) for r in rows) / len(rows)
print(f'average: {avg:.1f}')
print('Murad,"Gəncə, Azerbaijan",76'.split(','))
▸ Gözlənilən nəticə
['name', 'city', 'score']
['Aysel', 'Bakı', '91']
['Murad', 'Gəncə, Azerbaijan', '76']
['Leyla', 'Sumqayıt', '85']
Gəncə, Azerbaijan | str
average: 84.0
['Murad', '"Gəncə', ' Azerbaijan"', '76']

Yazmaq üçün csv.writer (siyahılar) və ya csv.DictWriter (lüğətlər) işlədilir. Modul lazım olan yerdə dırnaqları özü qoyur. Standarta görə sətirlər \r\n ilə bitir; burada nəticəni ekrana çıxarmaq üçün lineterminator='\n' veririk.

Python
import csv
import io

rows = [{'product': 'Tea', 'price': 4.5, 'qty': 30},
        {'product': 'Coffee, large', 'price': 6.0, 'qty': 25}]
buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=['product', 'price', 'qty'], lineterminator='\n')
writer.writeheader()
writer.writerows(rows)
print(buf.getvalue(), end='')
buf2 = io.StringIO()
csv.writer(buf2, delimiter=';', lineterminator='\n').writerow(['Tea', '4,5', 30])
print(buf2.getvalue(), end='')
▸ Gözlənilən nəticə
product,price,qty
Tea,4.5,30
"Coffee, large",6.0,25
Tea;4,5;30

Mini-layihə: CSV-dən JSON hesabatına

Qiymətlər CSV faylındadır, mobil tətbiq isə qruplar üzrə xülasəni JSON şəklində gözləyir. Proqram data qovluğunu yaradır, CSV-ni DictReader ilə oxuyur, balları qruplara yığır və hesabatı report.json faylına yazır.

Python
import csv
import json
from pathlib import Path

folder = Path('data')
folder.mkdir(exist_ok=True)
(folder / 'grades.csv').write_text(
    'name,group,score\nAysel,A,91\nMurad,B,76\nLeyla,A,85\nElvin,B,64\n', encoding='utf-8')

with open(folder / 'grades.csv', newline='', encoding='utf-8') as f:
    rows = list(csv.DictReader(f))

groups = {}
for r in rows:
    groups.setdefault(r['group'], []).append(int(r['score']))
report = {g: {'count': len(s), 'average': round(sum(s) / len(s), 1)} for g, s in groups.items()}

(folder / 'report.json').write_text(json.dumps(report, indent=2), encoding='utf-8')
print((folder / 'report.json').read_text(encoding='utf-8'))
print(sorted(p.name for p in folder.glob('*')))
▸ Gözlənilən nəticə
{
  "A": {
    "count": 2,
    "average": 88.0
  },
  "B": {
    "count": 2,
    "average": 70.0
  }
}
['grades.csv', 'report.json']
mkdir(exist_ok=True) qovluq artıq varsa xəta vermir, glob('*') isə qovluqdakı faylları sadalayır. Brauzerdə fayllar yaddaşdakı müvəqqəti fayl sistemində saxlanır.
Tapşırıq

JSON sətrindəki sifarişləri oxu. Birinci sətirdə bütün sifarişlərin ümumi məbləğini (2 onluq rəqəmə qədər yuvarlaqlaşdırılmış), ikinci sətirdə isə şəhərlər üzrə cəmləri JSON kimi çap et: Azərbaycan hərfləri kodlaşdırılmasın və açarlar sıralansın.

Tapşırıq · Python
import json

text = '[{"customer": "Aysel", "city": "Bakı", "total": 45.5}, {"customer": "Murad", "city": "Gəncə", "total": 30.0}, {"customer": "Leyla", "city": "Bakı", "total": 12.5}]'
# 1) total of all orders
# 2) totals by city as JSON (ensure_ascii=False, sort_keys=True)
▸ Gözlənilən nəticə
88.0
{"Bakı": 58.0, "Gəncə": 30.0}
Tapşırıq

CSV-ni csv.DictReader ilə oxu. Birinci sətirdə hər şəhərdən neçə tələbə olduğunu lüğət kimi, ikinci sətirdə orta balı ən yüksək olan şəhəri və həmin orta balı (boşluqla) çap et.

Tapşırıq · Python
import csv
import io

text = '''name,city,score
Aysel,Bakı,91
Murad,Gəncə,76
Leyla,Bakı,85
Elvin,Gəncə,64
Nigar,Sumqayıt,88'''
# count students per city, then find the city with the best average
▸ Gözlənilən nəticə
{'Bakı': 2, 'Gəncə': 2, 'Sumqayıt': 1}
Bakı 88.0

Əsas fikirlər

  • dumps / loads sətirlə, dump / load faylla işləyir; JSON-da true, false, null və yalnız sətir açarlar var.
  • Azərbaycan mətnləri üçün ensure_ascii=False və encoding='utf-8'; oxunaqlıq üçün indent=2.
  • Tarixlər və çoxluqlar JSON-a birbaşa yazılmır: default=str və ya ISO sətri işlət.
  • CSV-ni csv modulu ilə oxu və yaz, split(',') ilə yox; faylları newline='' ilə aç.
  • pathlib.Path: / ilə yollar, read_text, write_text, mkdir(exist_ok=True), glob.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
json.dumps({'ok': True, 'x': None}) nə qaytarır?