“Batareyalar bilan birga”
Python'ni köpinça “batareyalar bilan birga keladi” deb taʼriflaşadi. Buning maʼnosi: Python bilan birga yuzlab tayyor modul örnatiladi va ular heç qanday pip installsiz işlaydi. Bu modullar töplami standart kutubxona deyiladi.
Uşbu bobda eng köp işlatiladigan uçta yönalişni köramiz: sana va vaqt (datetime, zoneinfo), fayl tizimi (pathlib, os) va dasturning özi işlayotgan muhit (sys). Bu modullarni bilsangiz, hisobotlar tuziş, fayllarni tartiblaş va kiçik buyruq qatori dasturlarini yoziş ança osonlaşadi.
datetime: hozirgi sana va vaqt
datetime modulida bir neçta asosiy tur bor: date (faqat sana), time (faqat vaqt), datetime (sana va vaqt birga) va timedelta (ikki payt orasidagi farq). Eng oddiy savoldan boşlaymiz: hozir soat neça?
from datetime import date, datetime
hozir = datetime.now()
bugun = date.today()
print(type(hozir).__name__, type(bugun).__name__)
print("Yil:", hozir.year)
print("Bugun:", bugun)
Natija:
datetime date
Yil: 2026
Bugun: 2026-10-26
Sana va vaqtni özimiz yaratiş
Sana yoki vaqtni qölda yaratiş uçun ularning qismlarini argument sifatida beramiz. Har bir qismni alohida atribut orqali oliş mumkin. weekday() metodi hafta kunini raqam körinişida qaytaradi: duşanba — 0, yakşanba — 6.
from datetime import date, time, datetime
navroz = date(2027, 3, 21)
dars_vaqti = time(8, 30)
imtihon = datetime(2027, 1, 15, 9, 0)
print(navroz, dars_vaqti, imtihon)
print(navroz.year, navroz.month, navroz.day)
print("Hafta kuni raqami:", navroz.weekday())
print("Imtihon soati:", imtihon.hour)
Natija:
2027-03-21 08:30:00 2027-01-15 09:00:00
2027 3 21
Hafta kuni raqami: 6
Imtihon soati: 9
timedelta: vaqtni qöşiş va ayiriş
timedelta — “qança vaqt” degan savolga javob. Uni sanaga qöşib yoki ayirib, yangi sana olamiz. Masalan, kitob kutubxonadan 14 kunga berildi — qaçon qaytariş kerak?
from datetime import date, datetime, timedelta
olingan = date(2026, 10, 20)
muddat = timedelta(days=14)
print("Qaytariş kuni:", olingan + muddat)
boshlanish = datetime(2026, 10, 26, 22, 45)
film = timedelta(hours=2, minutes=20)
print("Film tugaydi:", boshlanish + film)
bir_hafta_oldin = olingan - timedelta(weeks=1)
print("Bir hafta oldin:", bir_hafta_oldin)
Natija:
Qaytariş kuni: 2026-11-03
Film tugaydi: 2026-10-27 01:05:00
Bir hafta oldin: 2026-10-13
Eʼtibor bering: ikkinçi misolda Python oy va kun almaşişini özi hisobga oldi — film ertasi kuni tugaydi. Fevralning 28 yoki 29 kunligi, oylarning turli uzunligi haqida ham öylaşingiz şart emas.
strftime va strptime: sana ↔ matn
Sanani çiroyli matnga aylantiriş uçun strftime() (string format time), matndan sanani öqiş uçun esa strptime() (string parse time) işlatiladi. Ikkalasi ham bir xil format kodlaridan foydalanadi.
| Kod | Maʼnosi | Misol |
|---|---|---|
%Y | tört xonali yil | 2026 |
%m | oy raqami | 03 |
%d | kun | 21 |
%H | soat (24 soatlik) | 14 |
%M | daqiqa | 05 |
%S | soniya | 09 |
%j | yilning neçançi kuni | 080 |
from datetime import datetime
payt = datetime(2027, 3, 21, 14, 5, 9)
print(payt.strftime("%d.%m.%Y"))
print(payt.strftime("%Y-%m-%d %H:%M"))
print(payt.strftime("Yilning %j-kuni"))
matn = "25.12.2026 18:30"
konsert = datetime.strptime(matn, "%d.%m.%Y %H:%M")
print(konsert, type(konsert).__name__)
Natija:
21.03.2027
2027-03-21 14:05
Yilning 080-kuni
2026-12-25 18:30:00 datetime
%B (oy nomi) va %A (hafta kuni nomi) kodlari ham bor, lekin ular odatda inglizça nom qaytaradi. Özbekça nomlar uçun eng işonçli yöl — öz röyxatingizni tuziş:
from datetime import date
OYLAR = ["yanvar", "fevral", "mart", "aprel", "may", "iyun",
"iyul", "avgust", "sentabr", "oktabr", "noyabr", "dekabr"]
KUNLAR = ["duşanba", "seşanba", "çorşanba", "payşanba",
"juma", "şanba", "yakşanba"]
def chiroyli(sana: date) -> str:
return f"{sana.day}-{OYLAR[sana.month - 1]}, {sana.year}-yil ({KUNLAR[sana.weekday()]})"
print(chiroyli(date(2027, 3, 21)))
print(chiroyli(date(2026, 9, 1)))
Natija:
21-mart, 2027-yil (yakşanba)
1-sentabr, 2026-yil (seşanba)
Ikki sana orasidagi farq va yoşni hisoblaş
Ikki sanani ayirsangiz, natija timedelta böladi. Undan days atributi orqali kunlar sonini, total_seconds() orqali esa soniyalarni oliş mumkin.
from datetime import date, datetime
bugun = date(2026, 10, 26)
navroz = date(2027, 3, 21)
farq = navroz - bugun
print(f"Navrözgaça {farq.days} kun qoldi")
kirish = datetime(2026, 10, 26, 8, 55)
chiqish = datetime(2026, 10, 26, 17, 10)
ish_vaqti = chiqish - kirish
print("Işda:", ish_vaqti)
print("Soatlarda:", ish_vaqti.total_seconds() / 3600)
Natija:
Navrözgaça 146 kun qoldi
Işda: 8:15:00
Soatlarda: 8.25
Yoşni hisoblaş biroz nozik: yillar farqidan bir yil ayiriş kerak, agar bu yil tuğilgan kun hali kelmagan bölsa. Kortejlarni soliştiriş bu tekşiruvni bitta qatorda bajarişga yordam beradi.
from datetime import date
def yosh(tugilgan: date, bugun: date) -> int:
hali_kelmagan = (bugun.month, bugun.day) < (tugilgan.month, tugilgan.day)
return bugun.year - tugilgan.year - hali_kelmagan
bugun = date(2026, 10, 26)
print(yosh(date(2000, 5, 14), bugun))
print(yosh(date(2000, 12, 1), bugun))
print(yosh(date(2008, 10, 26), bugun))
Natija:
26
25
18
Bu yerda hali_kelmagan — True yoki False. Python'da True son sifatida 1 ga, False esa 0 ga teng, şuning uçun uni bemalol ayiriş mumkin.
Timestamp: vaqt bitta son sifatida
Kompyuterlar vaqtni köpinça bitta son bilan saqlaydi: 1970-yil 1-yanvar, 00:00 (UTC) dan beri ötgan soniyalar. Bu son timestamp yoki “Unix vaqti” deyiladi. U maʼlumotlar bazalari va APIlarda juda keng tarqalgan, çunki bitta sonni saqlaş va soliştiriş oson.
from datetime import datetime, timezone
payt = datetime(2027, 1, 1, 0, 0, tzinfo=timezone.utc)
son = payt.timestamp()
print(son)
qaytadan = datetime.fromtimestamp(1_800_000_000, tz=timezone.utc)
print(qaytadan)
Natija:
1798761600.0
2027-01-15 08:00:00+00:00
zoneinfo: vaqt zonalari
Toşkentda soat 12:00 bölganda Istanbulda soat 10:00. Xalqaro buyurtmalar, onlayn uçraşuvlar yoki aviaçiptalar bilan işlaganda vaqt zonasini hisobga oliş şart. Python 3.9 dan beri standart kutubxonada zoneinfo moduli bor; zonalar "Asia/Tashkent", "Europe/Istanbul" kabi nomlar bilan beriladi.
from datetime import datetime
from zoneinfo import ZoneInfo
toshkent = ZoneInfo("Asia/Tashkent")
istanbul = ZoneInfo("Europe/Istanbul")
uchrashuv = datetime(2026, 11, 5, 15, 0, tzinfo=toshkent)
print("Toşkentda:", uchrashuv)
print("Istanbulda:", uchrashuv.astimezone(istanbul))
print("UTC böyiça:", uchrashuv.astimezone(ZoneInfo("UTC")))
hozir_toshkent = datetime.now(toshkent)
print("Toşkentda hozir:", hozir_toshkent.strftime("%H:%M"))
Natija (oxirgi qator siz işga tuşirgan vaqtga boğliq):
Toşkentda: 2026-11-05 15:00:00+05:00
Istanbulda: 2026-11-05 13:00:00+03:00
UTC böyiça: 2026-11-05 10:00:00+00:00
Toşkentda hozir: 17:42
pathlib: yöllar bilan qulay işlaş
Fayl va papkalar bilan işlaşning zamonaviy usuli — pathlib moduli. U yölni oddiy satr emas, balki Path obyekti sifatida köradi. Yöllarni / operatori bilan ulaş mumkin va bu Windowsda ham, Linuxda ham töğri işlaydi.
from pathlib import Path
hisobot = Path("hujjatlar") / "2026" / "oktabr_hisobot.txt"
print(hisobot)
print("Nomi:", hisobot.name)
print("Kengaytmasiz nomi:", hisobot.stem)
print("Kengaytmasi:", hisobot.suffix)
print("Papkasi:", hisobot.parent)
print("Bormi?", hisobot.exists())
Natija:
hujjatlar/2026/oktabr_hisobot.txt
Nomi: oktabr_hisobot.txt
Kengaytmasiz nomi: oktabr_hisobot
Kengaytmasi: .txt
Papkasi: hujjatlar/2026
Bormi? False
Path.cwd() joriy iş papkasini, Path.home() esa foydalanuvçining uy papkasini qaytaradi. Ular kompyuterdan kompyuterga farq qiladi, şuning uçun bu yerda çiqişini körsatmaymiz.
Papka yaratiş, fayl yoziş va röyxat oliş
Endi haqiqiy fayllar bilan işlaymiz. mkdir() papka yaratadi: parents=True oraliq papkalarni ham yaratadi, exist_ok=True esa papka allaqaçon bölsa xato bermaydi. write_text() va read_text() kiçik matnli fayllar uçun juda qulay.
from pathlib import Path
dokon = Path("kitob_dokoni")
(dokon / "hisobotlar").mkdir(parents=True, exist_ok=True)
(dokon / "narxlar.csv").write_text("kitob,narx\nAlgebra,45000\n", encoding="utf-8")
(dokon / "eslatma.txt").write_text("Duşanba kuni yangi kitoblar keladi.", encoding="utf-8")
(dokon / "hisobotlar" / "oktabr.txt").write_text("Sotuv: 120 dona", encoding="utf-8")
for element in sorted(dokon.iterdir()):
turi = "papka" if element.is_dir() else "fayl "
print(turi, element.name)
print((dokon / "eslatma.txt").read_text(encoding="utf-8"))
Natija:
fayl eslatma.txt
papka hisobotlar
fayl narxlar.csv
Duşanba kuni yangi kitoblar keladi.
Nomini özgartiriş va öçiriş
rename() fayl yoki papkaning nomini özgartiradi (yoki boşqa joyga köçiradi) va yangi Pathni qaytaradi. unlink() faylni, rmdir() esa böş papkani öçiradi.
from pathlib import Path
papka = Path("kitob_dokoni")
eski = papka / "eslatma.txt"
eski.write_text("Yangi kitoblar duşanba kuni keladi.", encoding="utf-8")
yangi = eski.rename(papka / "elon.txt")
print("Yangi nom:", yangi.name)
print("Eski fayl bormi?", eski.exists())
vaqtinchalik = papka / "vaqtinçalik.tmp"
vaqtinchalik.write_text("test", encoding="utf-8")
vaqtinchalik.unlink()
print("Öçirildimi?", not vaqtinchalik.exists())
Natija:
Yangi nom: elon.txt
Eski fayl bormi? False
Öçirildimi? True
glob va walk: fayllarni qidiriş
glob() berilgan naqşga mos fayllarni topadi: *.txt — joriy papkadagi barça .txt fayllar. rglob() esa barça içki papkalarni ham körib çiqadi. Eski kodlarda köp uçraydigan os.walk() ham şu işni qiladi: u har bir papka uçun uning yöli, içki papkalari va fayllarini qaytaradi.
import os
from pathlib import Path
papka = Path("kitob_dokoni")
print("Faqat yuqori papkadagi .txt:", [p.name for p in papka.glob("*.txt")])
print("Hamma joydagi .txt:", sorted(p.name for p in papka.rglob("*.txt")))
for yol, papkalar, fayllar in os.walk(papka):
print(yol, "->", sorted(fayllar))
Natija:
Faqat yuqori papkadagi .txt: ['elon.txt']
Hamma joydagi .txt: ['elon.txt', 'oktabr.txt']
kitob_dokoni -> ['elon.txt', 'narxlar.csv']
kitob_dokoni/hisobotlar -> ['oktabr.txt']
os moduli va pathlib: qaysi birini tanlaş?
os moduli Python'ning eng qadimgi modullaridan biri va eski kodlarda u bilan tez-tez uçraşasiz. Quyidagi jadval bir xil işni ikki usulda körsatadi. Yangi kod yozganda pathlibni afzal köring: u qisqaroq, öqilişi oson va yöllarni töğri birlaştiradi.
| Vazifa | os | pathlib |
|---|---|---|
| Joriy papka | os.getcwd() | Path.cwd() |
| Röyxat | os.listdir(p) | Path(p).iterdir() |
| Papka yaratiş | os.makedirs(p, exist_ok=True) | Path(p).mkdir(parents=True, exist_ok=True) |
| Nomini özgartiriş | os.rename(a, b) | Path(a).rename(b) |
| Faylni öçiriş | os.remove(p) | Path(p).unlink() |
| Yöllarni ulaş | os.path.join(a, b) | Path(a) / b |
| Bor-yöqligi | os.path.exists(p) | Path(p).exists() |
os moduli fayllardan taşqari ham foydali: os.environ orqali muhit özgaruvçilarini (parollar, sozlamalar) öqiysiz. Masalan, os.environ.get("DOKON_REJIMI", "oddiy") özgaruvçi bölmasa, standart qiymatni qaytaradi. Bu haqda internet bobida batafsil gaplaşamiz.
sys: dastur va muhit haqida
sys moduli Python interpretatorining özi haqida maʼlumot beradi va u bilan muloqot qilişga imkon yaratadi. Eng kerakli qismlar: sys.version (Python versiyasi), sys.argv (buyruq qatori argumentlari), sys.exit() (dasturni tugatiş), sys.stdout va sys.stderr (çiqiş oqimlari).
import sys
print(sys.version_info.major, sys.version_info.minor)
print(sys.version_info >= (3, 10))
print(type(sys.argv).__name__)
Natija:
3 12
True
list
Brauzerda yoki interaktiv rejimda sys.argv deyarli böş böladi. Uning haqiqiy kuçi dastur terminaldan işga tuşirilganda namoyon böladi.
sys.argv: buyruq qatori argumentlari
Terminalda python skript.py olma 5 deb yozsangiz, sys.argv röyxati ['skript.py', 'olma', '5'] böladi: birinçi element — skript nomi, qolganlari — siz bergan argumentlar. Hammasi satr körinişida keladi, sonlarni özingiz int() yoki float() bilan aylantirasiz.
Quyidagi valyuta.py skripti dollar miqdorini sömga ötkazadi:
# valyuta.py
import sys
def main() -> None:
if len(sys.argv) != 3:
print("Foydalaniş: python valyuta.py <dollar> <kurs>", file=sys.stderr)
sys.exit(1)
try:
dollar = float(sys.argv[1])
kurs = float(sys.argv[2])
except ValueError:
print("Xato: argumentlar son bölişi kerak", file=sys.stderr)
sys.exit(2)
print(f"{dollar} $ = {dollar * kurs:,.0f} söm")
if __name__ == "__main__":
main()
Terminalda işga tuşiramiz:
python valyuta.py 150 12650
python valyuta.py 150
echo $?
150.0 $ = 1,897,500 söm
Foydalaniş: python valyuta.py <dollar> <kurs>
1
Bu skriptda uçta muhim ğoya bor:
sys.exit(kod)dasturni darhol tugatadi.0— muvaffaqiyat,0dan farqli son — xato. Boşqa dasturlar (masalan,bashskriptlari) şu kodga qarab qaror qiladi;echo $?oxirgi buyruq kodini körsatadi.sys.stderr— xato xabarlari uçun alohida oqim. Oddiy natijani faylga yönaltirsangiz ham (> natija.txt), xatolar ekranda qoladi.if __name__ == "__main__":— fayl töğridan-töğri işga tuşirilgandamain()çaqiriladi, boşqa fayldanimportqilinganda esa çaqirilmaydi.
sys.stdout va sys.stderr
print() aslida matnni sys.stdoutga yozadi, print(..., file=sys.stderr) esa xato oqimiga. Xohlasangiz, oqimga töğridan-töğri sys.stdout.write("matn\n") deb yozişingiz ham mumkin — faqat write() qator oxiriga \n qöymasligini unutmang. Terminalda python valyuta.py 150 12650 > natija.txt deb işga tuşirsangiz, faylga faqat oddiy natija yoziladi, xato xabarlari esa ekranda körinadi. Bu ikki oqimning ajratilişi aynan şuning uçun kerak.
Xulosa
datetimemodulidadate,time,datetimevatimedeltaturlari bor; sanalarni qöşiş, ayiriş va soliştiriş mumkin.strftime()sanani matnga,strptime()matnni sanaga aylantiradi; ikkalasi ham%d,%m,%Ykabi kodlardan foydalanadi.timestamp— 1970-yildan beri ötgan soniyalar;zoneinfobilanAsia/Tashkent,Europe/Istanbulkabi zonalarga ötiş mumkin.pathlibfayl tizimi bilan işlaşning zamonaviy usuli:/bilan ulaş,mkdir,iterdir,rename,unlink,glob,rglob.oseski kodlarda köp uçraydi vaos.environuçun kerak böladi.sys.argvbuyruq qatori argumentlarini beradi,sys.exit()çiqiş kodini belgilaydi, xatolarsys.stderrga yoziladi.
Maşqlar
- Tuğilgan kun (
date) va bugungi sanani olib, keyingi tuğilgan kungaça neça kun qolganini qaytaradigan funksiya yozing. Bugun tuğilgan kun bölsa, 0 qaytarsin. (29-fevralni hisobga olmasangiz ham böladi.)
Yeçim
from datetime import date
def qolgan_kunlar(tugilgan: date, bugun: date) -> int:
keyingi = tugilgan.replace(year=bugun.year)
if keyingi < bugun:
keyingi = keyingi.replace(year=bugun.year + 1)
return (keyingi - bugun).days
bugun = date(2026, 10, 26)
print(qolgan_kunlar(date(1999, 11, 3), bugun))
print(qolgan_kunlar(date(2001, 10, 26), bugun))
print(qolgan_kunlar(date(2003, 1, 10), bugun))
"03.09.2026"körinişidagi sanalar röyxatini öqib, ularni eng eskisidan eng yangisigaça tartiblang va2026-09-03formatida çiqaring.
Yeçim
from datetime import datetime
matnlar = ["15.01.2027", "03.09.2026", "21.03.2027", "31.12.2026"]
sanalar = sorted(datetime.strptime(m, "%d.%m.%Y").date() for m in matnlar)
for sana in sanalar:
print(sana.strftime("%Y-%m-%d"))
pathlibyordamidamashq_papkapapkasini yarating, ungaa.txt,b.txt,rasm.png,jadval.csvnomli böş fayllar qöşing va har bir kengaytmadan neçta fayl borligini luğat körinişida çiqaring.
Yeçim
from collections import Counter
from pathlib import Path
papka = Path("maşq_papka")
papka.mkdir(exist_ok=True)
for nom in ["a.txt", "b.txt", "rasm.png", "jadval.csv"]:
(papka / nom).touch()
hisob = Counter(f.suffix for f in papka.iterdir() if f.is_file())
print(dict(sorted(hisob.items())))
yigindi.pyskriptini yozing: u buyruq qatorida berilgan barça sonlarning yiğindisini çiqarsin. Bitta ham son berilmasa yoki son bölmagan argument bölsa,stderrga xabar yozib,1kodi bilan çiqsin.
Yeçim
# yigindi.py — işlatiş: python yigindi.py 12 5.5 7
import sys
def main() -> None:
argumentlar = sys.argv[1:]
if not argumentlar:
print("Kamida bitta son bering", file=sys.stderr)
sys.exit(1)
try:
sonlar = [float(a) for a in argumentlar]
except ValueError:
print("Barça argumentlar son bölişi kerak", file=sys.stderr)
sys.exit(1)
print("Yiğindi:", sum(sonlar))
if __name__ == "__main__":
main()