os va pathlib — fayl tizimi, yo'llar, papka operatsiyalari
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.rmtreevaunlinkfayllarni 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 papkasiname,stem,suffix,parent,with_suffix()exists(),is_file(),is_dir(),stat().st_sizeread_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—osdan
Keyingi dars
40-dars: sys — sys.argv, sys.path, sys.exit()