json.dumps,json.loads,json.dump,json.loadilə Python obyektlərini JSON-a çevirmək və geri almaq- CSV-ni
csv.readervəcsv.DictReaderilə oxumaq,csv.writervəDictWriterilə yazmaq pathlib.Pathilə 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ə.
| Python | JSON |
|---|---|
dict | obyekt {...} |
list, tuple | massiv [...] |
str | sətir (qoşa dırnaqda) |
int, float | ədəd |
True, False, None | true, false, null |
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
]
}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.
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
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.
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.
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.
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.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.
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}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.
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/loadssətirlə,dump/loadfaylla işləyir; JSON-datrue,false,nullvə yalnız sətir açarlar var.- Azərbaycan mətnləri üçün
ensure_ascii=Falsevəencoding='utf-8'; oxunaqlıq üçünindent=2. - Tarixlər və çoxluqlar JSON-a birbaşa yazılmır:
default=strvə ya ISO sətri işlət. - CSV-ni
csvmodulu 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.
json.dumps({'ok': True, 'x': None}) nə qaytarır?