os va pathlib — fayl tizimi, yo'llar, papka operatsiyalari

~15 daq · Python · Modullar va Standart kutubxona

Muammodan boshlaylik

"Yuklamalar" papkasida 500 ta fayl: rasmlar, PDF lar, arxivlar aralash. Vazifa — ularni turlari bo'yicha papkalarga ajratish. Yoki: loyihadagi barcha .py fayllarni topish, eskirgan loglarni o'chirish, hisobot uchun reports/2026/11/ papkasini yaratish.

Bundan tashqari, yo'llar operatsion tizimga bog'liq:

yol = "data" + "\\" + "fayl.txt"     # Windows da ishlaydi, Linux da — yo'q

Ikki modul

os / os.path pathlib
Uslub Funksiyalar, yo'llar — oddiy string Ob'ektlar — Path
Paydo bo'lgan Python ning boshidan Python 3.4+
O'qishlilik os.path.join(a, b) a / b
Tavsiya Eski kod, muhit o'zgaruvchilari, jarayonlar Yangi kod uchun — fayl yo'llari

Bu darsda asosiy e'tibor — pathlib, va os ning hali ham kerak bo'ladigan qismlari.


Hayotiy o'xshatma

Pochta manzili. String yo'l — qog'ozga qo'lda yozilgan manzil: vergulni unutasiz, mamlakatga qarab format boshqacha. Path — navigator ilovadagi manzil: "Toshkent / Chilonzor / 5-uy" — tizim o'zi to'g'ri formatlaydi va "bu uy mavjudmi?", "qo'shni uylar qaysilar?" degan savollarga javob beradi.


Path yaratish

from pathlib import Path

p = Path("data/hisobotlar/oktabr.csv")
uy = Path.home()                    # C:\Users\Lola yoki /home/lola
joriy = Path.cwd()                  # joriy papka
skript_papka = Path(__file__).parent   # shu .py fayl turgan papka

/ bilan birlashtirish

data = Path("data")
fayl = data / "hisobotlar" / "oktabr.csv"
print(fayl)          # data/hisobotlar/oktabr.csv (Windows da data\hisobotlar\oktabr.csv)

/ — operatsion tizimga mos ajratuvchini o'zi qo'yadi.

[!TIP] Skript yonidagi fayllar uchun — Path(__file__).parent / "sozlama.json". Bu yo'l dastur qayerdan ishga tushirilishidan qat'i nazar to'g'ri ishlaydi (33-dars dagi nisbiy yo'l muammosi).


Yo'l qismlari

p = Path("/home/lola/hujjatlar/hisobot.final.pdf")

p.name        # 'hisobot.final.pdf'
p.stem        # 'hisobot.final'
p.suffix      # '.pdf'
p.suffixes    # ['.final', '.pdf']
p.parent      # Path('/home/lola/hujjatlar')
p.parents[1]  # Path('/home/lola')
p.parts       # ('/', 'home', 'lola', 'hujjatlar', 'hisobot.final.pdf')

p.with_suffix(".docx")         # .../hisobot.final.docx
p.with_name("yangi.pdf")       # .../yangi.pdf
p.resolve()                    # to'liq, absolyut yo'l

Tekshirish

p = Path("data/oktabr.csv")

p.exists()       # mavjudmi
p.is_file()      # fayl mi
p.is_dir()       # papka mi

p.stat().st_size         # hajm, baytlarda
p.stat().st_mtime        # oxirgi o'zgarish vaqti (timestamp)

Fayl o'qish va yozish — qisqa

p = Path("izoh.txt")

p.write_text("Salom, dunyo!", encoding="utf-8")
matn = p.read_text(encoding="utf-8")

p.write_bytes(b"\x89PNG...")
data = p.read_bytes()

with p.open("a", encoding="utf-8") as f:     # odatiy open() kabi
    f.write("\nYangi qator")

Papkalar

Path("reports/2026/11").mkdir(parents=True, exist_ok=True)
  • parents=True — oraliq papkalarni ham yaratish (mkdir -p)
  • exist_ok=True — mavjud bo'lsa xato bermaslik

Papka ichini ko'rish

papka = Path("Yuklamalar")

for p in papka.iterdir():               # faqat birinchi daraja
    print(p.name)

for p in papka.glob("*.pdf"):           # shablon bo'yicha
    print(p)

for p in Path(".").rglob("*.py"):       # barcha ichki papkalarda ham
    print(p)
Shablon Ma'nosi
*.txt .txt bilan tugaydigan
rasm_?.jpg rasm_1.jpg, rasm_a.jpg — bitta belgi
**/*.py Barcha ichki papkalarda (glob bilan)

Ko'chirish, nomini o'zgartirish, o'chirish

p = Path("eski.txt")
p.rename("yangi.txt")                 # nomini o'zgartirish / ko'chirish
p = Path("yangi.txt")
p.replace("arxiv/yangi.txt")          # bor bo'lsa ustidan yozadi

Path("vaqtinchalik.txt").unlink(missing_ok=True)   # faylni o'chirish
Path("bosh_papka").rmdir()                          # faqat BO'SH papka

Nusxalash va to'liq papkani o'chirish — shutil:

import shutil

shutil.copy2("hisobot.pdf", "zaxira/hisobot.pdf")   # metadata bilan nusxa
shutil.copytree("loyiha", "loyiha_zaxira")          # butun papka
shutil.move("eski_papka", "arxiv/")
shutil.rmtree("vaqtinchalik_papka")                 # ⚠️ ichidagi hamma narsa bilan
shutil.make_archive("zaxira", "zip", "loyiha")      # zaxira.zip

[!WARNING] shutil.rmtree va unlink fayllarni korzinaga emas, butunlay o'chiradi — qaytarib bo'lmaydi. O'chirishdan oldin yo'lni chop etib tekshiring, va ayniqsa yo'l foydalanuvchi kiritgan qiymatdan yoki o'zgaruvchidan yasalgan bo'lsa — u kutilgan papka ichida ekanini tasdiqlang.


Amaliy misol — fayllarni saralash

from pathlib import Path
import shutil

TURLAR = {
    "Rasmlar": {".jpg", ".jpeg", ".png", ".gif", ".webp"},
    "Hujjatlar": {".pdf", ".docx", ".xlsx", ".txt"},
    "Arxivlar": {".zip", ".rar", ".7z"},
    "Videolar": {".mp4", ".mkv", ".avi"},
}

def saralash(papka: Path):
    for fayl in papka.iterdir():
        if not fayl.is_file():
            continue
        tur = next(
            (nom for nom, kengaytmalar in TURLAR.items() if fayl.suffix.lower() in kengaytmalar),
            "Boshqa",
        )
        nishon = papka / tur
        nishon.mkdir(exist_ok=True)
        shutil.move(str(fayl), nishon / fayl.name)
        print(f"{fayl.name} → {tur}/")

if __name__ == "__main__":
    saralash(Path.home() / "Downloads")

os — hali ham kerak bo'ladigan qismlar

import os

os.environ.get("DATABASE_URL")          # muhit o'zgaruvchisi
os.environ.get("DEBUG", "false")
os.getcwd()                             # joriy papka (Path.cwd())
os.chdir("boshqa_papka")                # joriy papkani o'zgartirish
os.cpu_count()                          # protsessor yadrolari
os.sep                                  # '/' yoki '\\'

for papka, ichki_papkalar, fayllar in os.walk("loyiha"):   # daraxtni aylanib chiqish
    print(papka, len(fayllar))

os.path funksiyalari (join, exists, basename) eski kodda ko'p uchraydi — ular pathlib dagilarga mos:

os.path pathlib
os.path.join(a, b) Path(a) / b
os.path.exists(p) Path(p).exists()
os.path.basename(p) Path(p).name
os.path.splitext(p)[1] Path(p).suffix
os.makedirs(p, exist_ok=True) Path(p).mkdir(parents=True, exist_ok=True)
os.listdir(p) Path(p).iterdir()

Tez-tez uchraydigan xatolar

Yo'llarni string bilan qo'shish:

"data" + "/" + nom       # ❌ OS ga bog'liq, // yoki \/ aralashmasi
Path("data") / nom       # ✅

mkdir ni exist_ok siz:

Path("hisobot").mkdir()   # ikkinchi ishga tushirishda — FileExistsError

Path ni string kutadigan eski funksiyaga berish — ko'pchilik funksiyalar Path ni qabul qiladi; qabul qilmasa — str(p).


Xulosa

pathlib — yo'llar bilan ishlashning zamonaviy, OS ga bog'liq bo'lmagan usuli.

Eslab qoling:

  • Path("a") / "b" / "c.txt" — birlashtirish; Path(__file__).parent — skript papkasi
  • name, stem, suffix, parent, with_suffix()
  • exists(), is_file(), is_dir(), stat().st_size
  • read_text/write_text (encoding bilan); mkdir(parents=True, exist_ok=True)
  • iterdir(), glob("*.pdf"), rglob("*.py")
  • Nusxa, ko'chirish, papkani o'chirish — shutil; o'chirish qaytarilmaydi
  • os.environ, os.walk — os dan

Keyingi dars

40-dars: sys — sys.argv, sys.path, sys.exit()