OzbekPython / Bob 19

Standart kutubxona — vaqt, fayllar va tizim

datetime va zoneinfo bilan sana-vaqt, pathlib va os bilan fayl tizimi, sys bilan buyruq qatori argumentlari va dastur çiqişi.

Örta daraja22 daqiqa19 kod misoli19 / 24

“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?

Python
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:

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.

Python
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:

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?

Python
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:

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.

KodMaʼnosiMisol
%Ytört xonali yil2026
%moy raqami03
%dkun21
%Hsoat (24 soatlik)14
%Mdaqiqa05
%Ssoniya09
%jyilning neçançi kuni080
Python
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:

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ş:

Python
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:

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.

Python
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:

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.

Python
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:

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.

Python
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:

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.

Python
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):

Natija
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.

Python
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:

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.

Python
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:

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.

Python
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:

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.

Python
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:

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.

Vazifaospathlib
Joriy papkaos.getcwd()Path.cwd()
Röyxatos.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öqligios.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).

Python
import sys

print(sys.version_info.major, sys.version_info.minor)
print(sys.version_info >= (3, 10))
print(type(sys.argv).__name__)

Natija:

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:

Python
# 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:

Terminal
python valyuta.py 150 12650
python valyuta.py 150
echo $?
Natija
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, 0 dan farqli son — xato. Boşqa dasturlar (masalan, bash skriptlari) ş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şirilganda main() çaqiriladi, boşqa fayldan import qilinganda 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

  • datetime modulida date, time, datetime va timedelta turlari bor; sanalarni qöşiş, ayiriş va soliştiriş mumkin.
  • strftime() sanani matnga, strptime() matnni sanaga aylantiradi; ikkalasi ham %d, %m, %Y kabi kodlardan foydalanadi.
  • timestamp — 1970-yildan beri ötgan soniyalar; zoneinfo bilan Asia/Tashkent, Europe/Istanbul kabi zonalarga ötiş mumkin.
  • pathlib fayl tizimi bilan işlaşning zamonaviy usuli: / bilan ulaş, mkdir, iterdir, rename, unlink, glob, rglob.
  • os eski kodlarda köp uçraydi va os.environ uçun kerak böladi.
  • sys.argv buyruq qatori argumentlarini beradi, sys.exit() çiqiş kodini belgilaydi, xatolar sys.stderrga yoziladi.

Maşqlar

  1. 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
Python
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))
  1. "03.09.2026" körinişidagi sanalar röyxatini öqib, ularni eng eskisidan eng yangisigaça tartiblang va 2026-09-03 formatida çiqaring.
Yeçim
Python
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"))
  1. pathlib yordamida mashq_papka papkasini yarating, unga a.txt, b.txt, rasm.png, jadval.csv nomli böş fayllar qöşing va har bir kengaytmadan neçta fayl borligini luğat körinişida çiqaring.
Yeçim
Python
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())))
  1. yigindi.py skriptini 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, 1 kodi bilan çiqsin.
Yeçim
Python
# 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()