Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Fayllarni topish (glob)
- 2.2. Ko'chirish va nusxalash (shutil)
- 2.3. Nomlash (rename)
- 2.4. Papka yaratish (mkdir)
- 2.5. O'chirish (unlink)
- 2.6. Fayl ma'lumoti (stat)
- 2.7. O'qish/yozish (read_text)
- 2.8. Fayl avtomatlashtirish — ehtiyot
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Fayllarni topish va ma'lumot
- Misol 2 — Nomlash va papka yaratish
- Misol 3 — Ko'chirish va nusxalash
- Misol 4 — Amaliy: fayllarni tur bo'yicha tartiblash
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
26.2-dars: Fayllarni avtomatlashtirish
26-QISM — AVTOMATLASHTIRISH · 2-dars
1. Kirish va motivatsiya
Avtomatlashtirishning eng ko'p uchraydigan vazifasi — fayllar bilan ishlash: yuzlab fayllarni nomlash, papkalarga tartiblash, qidirish, ko'chirish, nusxalash, o'chirish. Qo'lda (Explorer/Finder bilan) — sekin, xatolarga moyil, zerikarli. Python bilan — bir skript, bir soniya. "Downloads papkasidagi barcha rasmlarni tur bo'yicha papkalarga ko'chir", "eski log fayllarni o'chir", "fayllarni sana bo'yicha nomla".
Fayllarni avtomatlashtirish — Python'ning fayl vositalari: pathlib (26.1 — yo'llar, .glob bilan qidirish), shutil (yuqori daraja — ko'chirish, nusxalash, o'chirish), os (past daraja — tizim amallari). Asosiy amallar: topish (glob — naqsh bo'yicha), nomlash (rename), ko'chirish (shutil.move), nusxalash (shutil.copy), o'chirish (unlink), papka yaratish (mkdir). Bu kundalik fayl vazifalarini avtomatlashtiradi. Fayl avtomatlashtirish — Python'ning eng amaliy ishi.
Real vaziyat. Bir fotograf har oy minglab rasmlarni sana va tur bo'yicha papkalarga tartiblardi — soatlab qo'lda. Python skript yozildi: pathlib.glob bilan rasmlarni topdi, stat bilan sanani oldi, shutil.move bilan papkalarga ko'chirdi. Soatlab ish bir daqiqada. Xatosiz, takrorlanadigan. Fayl avtomatlashtirish — vaqtni keskin tejaydi. Qo'lda ish o'rniga skript.
Bu darsda fayllarni avtomatlashtirishni o'rganamiz.
Bu darsda:
- Fayllarni topish (
glob) - Ko'chirish va nusxalash (
shutil) - Nomlash (
rename) - Papka yaratish (
mkdir) - O'chirish (
unlink) - Fayl ma'lumoti (
stat) - O'qish/yozish (
read_text) - Amaliy: fayl tartiblash
ℹ Misollarda pathlib, shutil vaqtincha papkada (
tempfile) sinaladi — deterministik.
2. Nazariya — chuqur tushuntirish
2.1. Fayllarni topish (glob)
Naqsh bo'yicha fayllar:
from pathlib import Path
Path("papka").glob("*.csv") # papkadagi CSV fayllar
Path("papka").glob("**/*.csv") # ichma-ich (rekursiv)
Path("papka").iterdir() # barcha (fayl + papka)
[p for p in Path(".").glob("*.txt")] # ro'yxatga Fayllarni topish (glob — 26.1, 15-qism): Path("papka").glob("*.csv") (papkadagi CSV — naqsh bilan), glob("**/*.csv") (rekursiv — ichma-ich papkalar ham), iterdir() (barcha element — fayl va papka). * (istalgan belgi), ? (bitta belgi), [abc] (to'plam). Bu ma'lum turdagi fayllarni topishning asosi (avtomatlashtirishning birinchi qadami). Natija — Path obyektlar (generator — ro'yxatga list()).
2.2. Ko'chirish va nusxalash (shutil)
Fayllarni joydan joyga:
import shutil
shutil.move("manba.txt", "yangi/joy.txt") # ko'chirish (o'chiradi)
shutil.copy("manba.txt", "nusxa.txt") # nusxalash (qoldiradi)
shutil.copytree("papka", "nusxa_papka") # papkani nusxalash shutil — yuqori daraja fayl amallari: move (ko'chirish — manbani o'chiradi), copy (nusxalash — manbani qoldiradi), copytree (butun papkani nusxalash), rmtree (papkani o'chirish — ehtiyot!). move/copy — fayl tartiblashda asosiy. pathlib.rename ham ko'chiradi (bir disk ichida), shutil.move (disklararo ham). Ko'chirish va nusxalash — fayl tartiblashning yuragi.
2.3. Nomlash (rename)
Fayl nomini o'zgartirish:
from pathlib import Path
Path("eski.txt").rename("yangi.txt")
# ko'plab nomlash (naqsh):
for i, f in enumerate(Path(".").glob("*.jpg")):
f.rename(f"rasm_{i:03d}.jpg") # rasm_000, rasm_001 Nomlash (Path.rename(yangi)) — fayl nomini o'zgartirish (yoki ko'chirish — yangi yo'l). Ko'plab nomlash — avtomatlashtirishning klassik vazifasi: glob bilan topib, siklda rename (rasm_{i:03d} — tartibli raqam). Bu qo'lda juda zerikarli, skriptda bir soniya. Ehtiyot: rename mavjud faylni ustiga yozadi (yo'qotish). Yangi nom noyob bo'lsin. Ko'plab nomlash — fayl avtomatlashtirishning eng foydali ishi.
2.4. Papka yaratish (mkdir)
Papkalarni yaratish:
from pathlib import Path
Path("yangi_papka").mkdir() # yaratish
Path("a/b/c").mkdir(parents=True, exist_ok=True) # ichma-ich + mavjud OK Papka yaratish (Path.mkdir()): mkdir() (bitta papka), parents=True (ichma-ich — a/b/c barcha daraja), exist_ok=True (mavjud bo'lsa xato bermasin — muhim!). Fayllarni tartiblashda papkalar yaratiladi (tur bo'yicha, sana bo'yicha). exist_ok=True — skript qayta ishlaganda xato bermaydi (idempotent). Papka yaratish — fayl tashkil qilishning asosi.
2.5. O'chirish (unlink)
Fayllarni o'chirish:
from pathlib import Path
Path("fayl.txt").unlink() # fayl o'chirish
Path("fayl.txt").unlink(missing_ok=True) # yo'q bo'lsa ham OK
import shutil
shutil.rmtree("papka") # papka + ichi (EHTIYOT!) O'chirish: Path.unlink() (fayl o'chirish), missing_ok=True (yo'q bo'lsa xato bermasin), shutil.rmtree(papka) (papka + barcha ichi — juda ehtiyot!). O'chirish qaytarib bo'lmaydi (savdoga tashlamaydi — butunlay) — ehtiyot bilan: avval tekshir (glob), tasdiqla, yoki savdoga ko'chir (o'chirish o'rniga). Avtomatlashtirishda o'chirish xavfli (skript ko'p faylni o'chirishi mumkin). "O'chirishdan oldin ikki marta o'yla".
2.6. Fayl ma'lumoti (stat)
Fayl haqida:
from pathlib import Path
p = Path("fayl.txt")
p.stat().st_size # hajm (bayt)
p.stat().st_mtime # o'zgartirilgan vaqt
p.is_file(); p.is_dir() # fayl/papka
p.exists() # bormi Fayl ma'lumoti: stat().st_size (hajm — bayt), stat().st_mtime (oxirgi o'zgarish vaqti — sana bo'yicha tartiblash), is_file()/is_dir() (fayl yoki papka), exists() (bormi). Bu fayllarni shart bo'yicha tanlashda (katta fayllar, eski fayllar) va tartiblashda (sana bo'yicha) kerak. Fayl metama'lumoti — aqlli avtomatlashtirish (nafaqat nom, balki xususiyat bo'yicha).
2.7. O'qish/yozish (read_text)
Fayl mazmuni:
from pathlib import Path
matn = Path("fayl.txt").read_text(encoding="utf-8") # o'qish
Path("yangi.txt").write_text("mazmun", encoding="utf-8") # yozish
data = Path("fayl.bin").read_bytes() # binar O'qish/yozish (pathlib — 15-qism): read_text(encoding="utf-8") (matn o'qish — bir qatorda, open o'rniga), write_text(matn) (yozish), read_bytes/write_bytes (binar). encoding="utf-8" — o'zbekcha uchun. Bu fayl mazmuni bilan ishlash (nafaqat nom/joy). Avtomatlashtirishda: fayllarni o'qib qayta ishlash, hisobot yozish. pathlib — oddiy o'qish/yozish uchun qulay (katta fayl — open + sikl).
2.8. Fayl avtomatlashtirish — ehtiyot
Fayl avtomatlashtirish kuchli, lekin xavfli (ko'p faylga ta'sir): o'chirish qaytarib bo'lmaydi (avval sinab ko'r — glob natijani chop et, keyin o'chir), ko'chirish/nomlash ustiga yozadi (noyob nom), skript ko'p faylni o'zgartiradi (bir xato — ko'p zarar). Xavfsizlik: avval sinab ko'r (nima o'zgaradi — chop et, o'zgartmasdan), nusxa bilan ishla (asl saqla), exist_ok (idempotent). "Kuch bilan mas'uliyat" — fayl skripti ko'p faylni bir zumda o'zgartiradi. Avtomatlashtirish — foydali, lekin ehtiyotli.
3. Tez ma'lumotnoma
from pathlib import Path
import shutil
# topish (glob):
Path("papka").glob("*.csv") # naqsh
Path("papka").glob("**/*.csv") # rekursiv
Path("papka").iterdir() # barcha
# ko'chirish/nusxalash (shutil):
shutil.move("a.txt", "yangi/a.txt") # ko'chir
shutil.copy("a.txt", "b.txt") # nusxa
# nomlash:
Path("eski.txt").rename("yangi.txt")
# papka:
Path("a/b/c").mkdir(parents=True, exist_ok=True)
# o'chirish (EHTIYOT):
Path("f.txt").unlink(missing_ok=True)
shutil.rmtree("papka")
# ma'lumot:
p.stat().st_size; p.stat().st_mtime
p.is_file(); p.is_dir(); p.exists()
# o'qish/yozish:
Path("f.txt").read_text(encoding="utf-8")
Path("f.txt").write_text("mazmun", encoding="utf-8")Fayl avtomatlashtirish xulosasi
glob (topish, rekursiv) · shutil.move/copy (ko'chir/nusxa) · rename (nomlash)
mkdir (parents, exist_ok) · unlink/rmtree (o'chir — EHTIYOT) · stat (ma'lumot)
read_text/write_text · avval sinab ko'r (xavfli amal)4. Batafsil misollar
Misollarda pathlib, shutil vaqtincha papkada (
tempfile) sinaladi — deterministik, xavfsiz.
Misol 1 — Fayllarni topish va ma'lumot
"""glob (naqsh bo'yicha topish); stat (hajm); is_file — fayllarni tanlash."""
import tempfile
from pathlib import Path
def main() -> None:
# vaqtincha papka va fayllar (deterministik)
base = Path(tempfile.mkdtemp())
for nom in ["a.txt", "b.csv", "c.txt", "d.csv", "e.log"]:
(base / nom).write_text("test mazmun", encoding="utf-8")
print("=== 1. Barcha fayllar (iterdir) ===")
fayllar = sorted(p.name for p in base.iterdir() if p.is_file())
print(f" {fayllar}")
print("\n=== 2. CSV fayllar (glob) ===")
csv = sorted(p.name for p in base.glob("*.csv"))
print(f" {csv}")
print("\n=== 3. Fayl ma'lumoti (stat) ===")
p = base / "a.txt"
print(f" a.txt hajmi: {p.stat().st_size} bayt")
print(f" fayl-mi: {p.is_file()}, papka-mi: {p.is_dir()}")
print("\n=== 4. Shart bo'yicha (kengaytirish) ===")
txt = [p.name for p in base.glob("*.txt")]
print(f" txt fayllar: {sorted(txt)}, soni: {len(txt)}")
print(" ⭐ glob (topish) + stat (ma'lumot) — fayllarni tanlash")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Barcha fayllar (iterdir) ===
['a.txt', 'b.csv', 'c.txt', 'd.csv', 'e.log']
=== 2. CSV fayllar (glob) ===
['b.csv', 'd.csv']
=== 3. Fayl ma'lumoti (stat) ===
a.txt hajmi: 11 bayt
fayl-mi: True, papka-mi: False
=== 4. Shart bo'yicha (kengaytirish) ===
txt fayllar: ['a.txt', 'c.txt'], soni: 2
⭐ glob (topish) + stat (ma'lumot) — fayllarni tanlashNima ko'rsatdi: 2.1, 2.6-bo'limlar.
Misol 2 — Nomlash va papka yaratish
"""rename (nomlash, ko'plab); mkdir (papka yaratish, parents/exist_ok)."""
import tempfile
from pathlib import Path
def main() -> None:
base = Path(tempfile.mkdtemp())
for nom in ["photo1.jpg", "photo2.jpg", "photo3.jpg"]:
(base / nom).write_text("rasm", encoding="utf-8")
print("=== 1. Boshlang'ich fayllar ===")
print(f" {sorted(p.name for p in base.iterdir())}")
print("\n=== 2. Ko'plab nomlash (tartibli raqam) ===")
for i, f in enumerate(sorted(base.glob("*.jpg"))):
f.rename(base / f"rasm_{i:03d}.jpg")
print(f" {sorted(p.name for p in base.iterdir())}")
print("\n=== 3. Papka yaratish (parents, exist_ok) ===")
yangi = base / "arxiv" / "2024"
yangi.mkdir(parents=True, exist_ok=True)
print(f" yaratildi: {yangi.exists()}")
print("\n=== 4. exist_ok (qayta yaratish xato bermaydi) ===")
yangi.mkdir(parents=True, exist_ok=True) # ikkinchi marta
print(f" qayta yaratish xatosiz: {yangi.exists()}")
print(" ⭐ rename (ko'plab nomlash), mkdir (papka)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Boshlang'ich fayllar ===
['photo1.jpg', 'photo2.jpg', 'photo3.jpg']
=== 2. Ko'plab nomlash (tartibli raqam) ===
['rasm_000.jpg', 'rasm_001.jpg', 'rasm_002.jpg']
=== 3. Papka yaratish (parents, exist_ok) ===
yaratildi: True
=== 4. exist_ok (qayta yaratish xato bermaydi) ===
qayta yaratish xatosiz: True
⭐ rename (ko'plab nomlash), mkdir (papka)Nima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — Ko'chirish va nusxalash
"""shutil.move (ko'chirish — o'chiradi); shutil.copy (nusxalash — qoldiradi)."""
import shutil
import tempfile
from pathlib import Path
def main() -> None:
base = Path(tempfile.mkdtemp())
for nom in ["hisobot.csv", "rasm.jpg", "matn.txt"]:
(base / nom).write_text("data", encoding="utf-8")
print("=== 1. Boshlang'ich ===")
print(f" {sorted(p.name for p in base.iterdir())}")
print("\n=== 2. Papka yaratish va ko'chirish (move) ===")
(base / "csv_papka").mkdir()
shutil.move(str(base / "hisobot.csv"), str(base / "csv_papka" / "hisobot.csv"))
print(f" csv_papka: {[p.name for p in (base / 'csv_papka').iterdir()]}")
print(f" asl joyda hisobot.csv: {(base / 'hisobot.csv').exists()} (ko'chdi)")
print("\n=== 3. Nusxalash (copy — qoldiradi) ===")
shutil.copy(str(base / "matn.txt"), str(base / "matn_nusxa.txt"))
print(f" asl matn.txt: {(base / 'matn.txt').exists()}")
print(f" nusxa matn_nusxa.txt: {(base / 'matn_nusxa.txt').exists()}")
print("\n=== 4. move vs copy ===")
print(" move: manbani o'chiradi (ko'chirish)")
print(" copy: manbani qoldiradi (nusxalash)")
print(" ⭐ shutil — ko'chirish (move) va nusxalash (copy)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Boshlang'ich ===
['hisobot.csv', 'matn.txt', 'rasm.jpg']
=== 2. Papka yaratish va ko'chirish (move) ===
csv_papka: ['hisobot.csv']
asl joyda hisobot.csv: False (ko'chdi)
=== 3. Nusxalash (copy — qoldiradi) ===
asl matn.txt: True
nusxa matn_nusxa.txt: True
=== 4. move vs copy ===
move: manbani o'chiradi (ko'chirish)
copy: manbani qoldiradi (nusxalash)
⭐ shutil — ko'chirish (move) va nusxalash (copy)Nima ko'rsatdi: 2.2-bo'lim.
Misol 4 — Amaliy: fayllarni tur bo'yicha tartiblash
Real avtomatlashtirish: aralash fayllarni kengaytirish bo'yicha papkalarga tartiblash. Bu — fayl tashkil qilishning namunasi.
"""to'liq: aralash fayllarni kengaytirish bo'yicha papkalarga tartiblash (glob + mkdir + move)."""
import shutil
import tempfile
from pathlib import Path
def tartibla(papka: Path) -> dict:
"""Fayllarni kengaytirish bo'yicha papkalarga ko'chir."""
natija: dict = {}
for f in list(papka.iterdir()):
if f.is_file():
kengaytma = f.suffix[1:] or "boshqa" # ".csv" → "csv"
maqsad = papka / kengaytma
maqsad.mkdir(exist_ok=True)
shutil.move(str(f), str(maqsad / f.name))
natija.setdefault(kengaytma, []).append(f.name)
return natija
def main() -> None:
base = Path(tempfile.mkdtemp())
for nom in ["a.csv", "b.txt", "c.csv", "d.jpg", "e.txt", "f.jpg"]:
(base / nom).write_text("data", encoding="utf-8")
print("=== 1. Boshlang'ich (aralash) ===")
print(f" {sorted(p.name for p in base.iterdir())}")
print("\n=== 2. Tur bo'yicha tartiblash ===")
natija = tartibla(base)
for kengaytma in sorted(natija):
print(f" {kengaytma}: {sorted(natija[kengaytma])}")
print("\n=== 3. Papkalar tuzilishi ===")
for papka in sorted(p.name for p in base.iterdir() if p.is_dir()):
fayllar = sorted(x.name for x in (base / papka).iterdir())
print(f" {papka}/: {fayllar}")
print("\n=== 4. Yakun ===")
print(f" {len(natija)} tur papkasi yaratildi")
print(" ⭐ fayl tartiblash — glob + mkdir + move (avtomatik)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Boshlang'ich (aralash) ===
['a.csv', 'b.txt', 'c.csv', 'd.jpg', 'e.txt', 'f.jpg']
=== 2. Tur bo'yicha tartiblash ===
csv: ['a.csv', 'c.csv']
jpg: ['d.jpg', 'f.jpg']
txt: ['b.txt', 'e.txt']
=== 3. Papkalar tuzilishi ===
csv/: ['a.csv', 'c.csv']
jpg/: ['d.jpg', 'f.jpg']
txt/: ['b.txt', 'e.txt']
=== 4. Yakun ===
3 tur papkasi yaratildi
⭐ fayl tartiblash — glob + mkdir + move (avtomatik)Nima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Fayl ishi — qo'lda" | Avtomatlashtirish (skript) |
"glob faqat bir papka" |
** rekursiv |
"move = copy" |
move o'chiradi, copy qoldiradi |
| "O'chirish — savdoga" | Butunlay (qaytarib bo'lmaydi) |
"rename xavfsiz" |
Ustiga yozadi |
"mkdir mavjudda xato" |
exist_ok=True |
| "Skript kam faylga" | Ko'p faylni bir zumda |
| "Sinash keraksiz" | Avval sinab ko'r (xavfli) |
6. Keng tarqalgan xatolar va yechimlari
1. O'chirishdan oldin sinamaslik
for f in glob("*"): f.unlink() # ⚠️ barcha o'chdi (xato bo'lsa?)
for f in glob("*"): print(f) # avval ko'r # ✅ keyin o'chir2. rename ustiga yozish
f.rename("mavjud.txt") # ⚠️ mavjud yo'qoladi
# noyob nom yoki tekshir # ✅3. mkdir mavjudda crash
Path("papka").mkdir() # mavjud bo'lsa xato # ⚠️
Path("papka").mkdir(exist_ok=True) # ✅4. rmtree ehtiyotsiz
shutil.rmtree(papka) # butun papka (EHTIYOT) # ⚠️
# avval tekshir, tasdiqla # ✅5. Encoding unutish (o'qish/yozish)
Path("f.txt").read_text() # ba'zan xato # ⚠️
Path("f.txt").read_text(encoding="utf-8") # ✅6. glob generator (ikki marta)
g = Path(".").glob("*")
list(g); list(g) # ikkinchi bo'sh # ⚠️
fayllar = list(Path(".").glob("*")) # ✅7. Nisbiy yo'l (noto'g'ri papka)
Path("fayl.txt") # joriy papkaga bog'liq # ⚠️
Path("/aniq/yo'l/fayl.txt") # aniq # ✅ (yoki base bilan)7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 26.1-dars (o'tilgan): Skript — fayl skripti
- 15-qism (o'tilgan): pathlib, fayl I/O
- 24.6-dars (o'tilgan): CSV o'qish — fayllardan
- 26.10-dars: Excel — fayl formati
- 26.9-dars: Cron — fayl tozalash (rejalangan)
8. Eng yaxshi amaliyotlar
globbilan top (naqsh, rekursiv).shutil.move/copy(ko'chir/nusxa).mkdir(exist_ok=True)(idempotent).O'chirishdan oldin sinab ko'r (chop et).
Noyob nom (
renameustiga yozadi).encoding="utf-8"(o'zbekcha).globnatijasini ro'yxatga (generator).Xavfli amalda nusxa bilan (asl saqla).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # glob nima?
2. # ** nima?
3. # iterdir nima?
4. # shutil.move nima?
5. # shutil.copy nima?
6. # move vs copy?
7. # rename nima?
8. # mkdir exist_ok?
9. # unlink nima?
10. # rmtree nima (ehtiyot)?
11. # stat nima?
12. # o'chirish qaytarib bo'ladimi?Javoblar
- Naqsh bo'yicha fayl topish
- Rekursiv (ichma-ich papka)
- Papkadagi barcha element
- Ko'chirish (o'chiradi)
- Nusxalash (qoldiradi)
- move o'chiradi, copy qoldiradi
- Nom o'zgartirish
- Mavjud bo'lsa xato bermasin
- Fayl o'chirish
- Papka + ichi o'chirish (juda ehtiyot)
- Fayl ma'lumoti (hajm, vaqt)
- Yo'q (butunlay)
Vazifa 2: Xatolarni tuzating
1. for f in glob("*"): f.unlink() # avval sinab ko'r
2. Path("papka").mkdir() # mavjudda # exist_ok
3. Path("f.txt").read_text() # encoding
4. g=glob("*"); list(g); list(g) # ro'yxatga
5. f.rename("mavjud.txt") # noyob nomJavoblar
1. for f in glob("*"): print(f) # keyin o'chir
2. Path("papka").mkdir(exist_ok=True)
3. Path("f.txt").read_text(encoding="utf-8")
4. fayllar = list(glob("*"))
5. # noyob nom yoki tekshirVazifa 3: Topish
Fayllar:
glob**rekursiviterdirstat
Vazifa 4: Nomlash/papka
Amal:
rename- Ko'plab nomlash
mkdirexist_ok
Vazifa 5: Ko'chirish
shutil:
movecopy- Farq
- Papka
Vazifa 6: Tartiblash
To'liq:
- Topish
- Papka
- Ko'chirish
- Statistika
Vazifa 7: O'ylash
Fayl avtomatlashtirish kuchli — skript ko'p faylni bir zumda o'zgartiradi. Lekin bu xavfli: o'chirish qaytarib bo'lmaydi, ko'chirish/nomlash ustiga yozadi, bir xato ko'p zarar. Nima uchun "avval sinab ko'r" (dry run — o'zgartmasdan nima o'zgaradiganini ko'rish) xavfli fayl amallarida muhim, va nega "kuch bilan mas'uliyat" avtomatlashtirishda ayniqsa amal qiladi?
Javob
Qisqa javob: Fayl avtomatlashtirish kuchli (skript ko'p faylni bir zumda o'zgartiradi) va shuning uchun xavfli: o'chirish qaytarib bo'lmaydi (savdoga emas — butunlay), ko'chirish/nomlash ustiga yozadi (yo'qotish), bir xato ko'p zarar (skript 1000 faylni noto'g'ri o'zgartiradi). "Avval sinab ko'r" (dry run — o'zgartmasdan nima o'zgaradiganini chop etish) muhim, chunki: xato mantiqni (noto'g'ri glob, noto'g'ri yo'l) oldin ko'rasiz (o'zgartmasdan), ishonch hosil qilasiz, keyin bajarasiz. "Kuch bilan mas'uliyat" avtomatlashtirishda ayniqsa amal qiladi, chunki: qo'lda bir faylni o'chirsangiz — bir xato; skript 1000 faylni o'chiradi — 1000 xato (bir zumda, qaytarib bo'lmaydi). Kuch (avtomatik, ko'p) mas'uliyat (ehtiyot, sinash, nusxa) talab qiladi. "Avtomatlashtirilgan xato — avtomatlashtirilgan zarar".
1. Fayl avtomatlashtirish kuchli va xavfli
Skript ko'p faylni bir zumda — kuch. Lekin xato ham ko'p (bir xato → 1000 fayl).
2. Nega xavfli
| Amal | Xavf |
|---|---|
| O'chirish | Qaytarib bo'lmaydi |
| Ko'chirish/nomlash | Ustiga yozadi |
| Ko'p fayl | Bir xato → ko'p zarar |
3. "Avval sinab ko'r" (dry run)
O'zgartmasdan nima o'zgaradiganini chop et: noto'g'ri mantiqni oldin ko'rasiz, ishonch, keyin bajar. Xatoni oldin top.
4. Kuch bilan mas'uliyat
Qo'lda — bir xato (bir fayl). Skript — 1000 xato (bir zumda). Kuch mas'uliyat talab qiladi: sinash, nusxa (asl saqla), ehtiyot (o'chirish).
5. Muhandislik saboqlari
- Fayl avtomatlashtirish kuchli, xavfli
- Avval sinab ko'r (dry run)
- Nusxa bilan ishla (asl saqla)
- Kuch bilan mas'uliyat (ko'p fayl)
6. Xulosa
- Skript ko'p faylni bir zumda
- Xato ham ko'p (qaytarib bo'lmaydi)
- Avval sinab ko'r (dry run)
- Kuch bilan mas'uliyat
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda fayllarni avtomatlashtirishni o'rgandik.
Eng muhim uch fikr:
Topish va ko'chirish/nusxalash. Fayllarni topish (
glob— 26.1, 15-qism):Path("papka").glob("*.csv")(naqsh bilan),glob("**/*.csv")(rekursiv — ichma-ich),iterdir()(barcha element). Ko'chirish/nusxalash (shutil):move(ko'chirish — manbani o'chiradi),copy(nusxalash — manbani qoldiradi),copytree(papka nusxa),rmtree(papka o'chir — ehtiyot).pathlib.renameham ko'chiradi. Bu fayl tartiblashning yuragi — topib, joydan joyga.Nomlash, papka, o'chirish, ma'lumot. Nomlash (
Path.rename) — ko'plab nomlash avtomatlashtirishning klassik vazifasi (glob+ sikldarename—rasm_{i:03d}). Papka yaratish (mkdir(parents=True, exist_ok=True)— ichma-ich + mavjudda xato bermasin). O'chirish (unlink(missing_ok=True),shutil.rmtree— qaytarib bo'lmaydi, ehtiyot). Fayl ma'lumoti (stat().st_sizehajm,st_mtimevaqt,is_file()/is_dir(),exists()— shart bo'yicha tanlash). O'qish/yozish (read_text/write_text,encoding="utf-8").Kuch bilan mas'uliyat. Fayl avtomatlashtirish kuchli (skript ko'p faylni bir zumda o'zgartiradi) va shuning uchun xavfli: o'chirish qaytarib bo'lmaydi, ko'chirish/nomlash ustiga yozadi, bir xato ko'p zarar (1000 fayl). Xavfsizlik: avval sinab ko'r (dry run — o'zgartmasdan nima o'zgaradiganini chop et, xatoni oldin top), nusxa bilan ishla (asl saqla),
exist_ok(idempotent). "Kuch bilan mas'uliyat" avtomatlashtirishda ayniqsa amal qiladi — qo'lda bir xato (bir fayl), skript 1000 xato (bir zumda). Avtomatlashtirish vaqtni keskin tejaydi (soatlab ish — daqiqada), lekin ehtiyotli. "Avtomatlashtirilgan xato — avtomatlashtirilgan zarar".
Keyingi darsda web scraping: requests ni o'rganamiz: internetdan ma'lumot yig'ish — veb sahifalarni yuklab, HTTP so'rovlar bilan ma'lumot olish — avtomatlashtirishning kuchli sohasi.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!