Barcha qo'llanmalar

Python glob module'i: fayllarni pattern bo'yicha moslashtirish tushuntirildi

Python glob module'i nima ekanini va u katta loyihalarda pattern'ga asoslangan qidiruvlarni qanday soddalashtirishi mumkinligini o'rganing.

Muallif: Ekene Eze

Bir nechta fayl bilan ishlayotganingizda fayllarni topish va tartibga solish oddiy ish bo'lib tuyuladi. Papkalar yaratasiz, narsalarga tushunarli nom berasiz va hammasini topish oson bo'ladi. Ammo loyiha o'sib, unda ko'plab papkalar va oldindan aytib bo'lmaydigan fayl nomlari paydo bo'lgach, xuddi shu vazifa tezda dahshatli tushga aylanishi mumkin.

Bunday qiyinchiliklarga yuklab olingan fayllarni tartibga solishda, log fayllarni qayta ishlashda yoki eski backup'larni tozalashda duch kelasiz. Bu fayllarni oldindan aytib bo'lmagani uchun fayl nomlari o'zgarishi, papkalar kattalashishi va taxminlar buzilishi mumkin. Sizga fayllarni hardcode qilingan nomlar bo'yicha emas, balki pattern'lar bo'yicha moslashtirish usuli kerak bo'ladi. Aynan shu muammoni Python'ning glob module'i kabi pattern'ga asoslangan fayl moslashtirish tizimi hal qila oladi. U wildcard'lar, kvadrat qavslar va boshqa pattern'lar yordamida fayllarni topish imkonini beradi, bu esa fayllarni tartibga solishni ancha osonlashtiradi.

Ushbu qo'llanmada siz bu module nima ekanini, undan qanday samarali foydalanishni va u real loyihalarda qayerda o'zini eng yaxshi ko'rsatishini bilib olasiz.

Python glob module'i nima?

Python glob module'i standart kutubxonaning bir qismi bo'lib, berilgan pattern'ga mos keladigan fayl va papkalarni topish uchun ishlatiladi. U papkalar bo'ylab loop qilib, fayl nomlarini birma-bir tekshirish o'rniga fayl tizimida Unix shell uslubidagi wildcard pattern'lari yordamida qidirish imkonini beradi.

Mohiyatan glob pattern'ga asoslangan fayl moslashtirishni xuddi terminalda *.txt yoki logs/*.log kabi fayllarni qidirgandek bajaradi. Bu loop'lar ichidagi oddiy string moslashtirishdan farq qiladi. glob matn pattern'larini solishtirish o'rniga fayl tizimini aylanib chiqadi va har bir yozuvni sizning pattern qoidalaringizga muvofiqligini tekshiradi.

*.py kabi narsa yozganingizda u *.py literal string'ini qidirmaydi. Buning o'rniga u maqsadli papkani skanerlaydi va ko'rsatilgan pattern'ga mos keladigan barcha pathname'larni (bu holatda py fayllarni) qaytaradi; bu pathname'lar fayllarni ham, papkalarni ham o'z ichiga olishi mumkin. Agar to'liq path'dan faqat fayl nomi kerak bo'lsa, uni os.path.basename kabi funksiyalar yordamida ajratib olishingiz mumkin.

glob qanday ishlaydi

Bu workflow glob'ni fayl nomlari dinamik yoki faqat qisman ma'lum bo'lgan vaziyatlar uchun juda mos qiladi, masalan, timestamp qo'shilgan log'lar, eksport qilingan hisobotlar yoki foydalanuvchilar yuklagan fayllar.

Qo'llab-quvvatlanadigan wildcard belgilar

Glob fayl va papkalar bo'ylab qidirish uchun uchta asosiy wildcard belgidan foydalanadi:

  • * path'ning bitta segmentidagi nol yoki undan ko'p belgiga mos keladi. Masalan, *.txt papkadagi barcha matnli fayllarga mos keladi.

  • ? aynan bitta belgiga mos keladi. Masalan, data_?.csv data_1.csv yoki data_a.csv'ga mos keladi, lekin data_10.csv'ga mos kelmaydi.

  • [] qavslar ichidagi istalgan bitta belgiga mos keladi. Masalan, file_[abc].log file_a.log, file_b.log va file_c.log'ga mos keladi.

Glob moslashtirish mexanizmi

Qavslardan maxsus belgilarni literal tarzda moslashtirish uchun ham foydalanishingiz mumkin; masalan, nomida yulduzcha bo'lgan faylni moslashtirish uchun []'dan foydalaning. " va ? kabi maxsus belgilarni kvadrat qavslar ichiga olish orqali literal tarzda moslashtirish mumkin. Qavslar character class'lar va diapazonlarni ham belgilashi mumkin, masalan, istalgan kichik harfga mos kelish uchun [a-z] yoki katta harflar uchun [A-Z]. Belgilar diapazoni yozuvi ([seq]) to'plamdagi istalgan belgiga mos keladi, shuning uchun [a-z] 'a' dan 'z' gacha bo'lgan istalgan belgiga mos keladi.

Quyida mos keladigan barcha matnli fayllarni qidirish uchun glob'dan qanday foydalanish mumkinligiga misol keltirilgan:

import glob 

files = glob.glob("*.txt")
print(files)

Bu joriy papkadagi .txt pattern'iga mos keladigan barcha pathname'lar list'ini qaytaradi.

Hozircha biz module nima ekanini va u qaysi muammoni hal qilishini ko'rib chiqdik. Keyingi qadam — uni real kodda qo'llash va pattern'ga asoslangan fayl moslashtirish kundalik Python loyihalariga qanday mos tushishini o'rganish.

Python'da glob'ni qo'llash

Keling, glob'ni kundalik vazifalaringizda qanday ishga solishingiz mumkinligini amalda ko'rib chiqaylik. Hammasini sodda saqlash uchun Python'ning standart kutubxonasidan foydalanib, oddiydan boshlaymiz va asta-sekin ilg'orroq imkoniyatlarga o'tamiz.

Mohiyatan glob fayllarni topish uchun yuqori darajadagi interfeys taqdim etadi va root papkani traverse qilishning murakkabligini yashiradi. Bu shuni anglatadiki, fayllar bo'ylab qo'lda iteratsiya qilishingiz, papkalarni ochishingiz yoki natijalarni filtrlashingiz shart emas. Siz shunchaki pattern'ni tasvirlaysiz, qolganini esa glob bitta funksiya chaqiruvida o'zi bajaradi.

Bitta papkada oddiy fayl moslashtirish

Bu glob module'idan foydalanishning eng keng tarqalgan usuli. U pattern yordamida bitta papkadagi fayllarni moslashtirish imkonini beradi. Masalan, agar siz oylik Excel hisobotlari, CSV fayllar yoki ilova yaratgan rasmlar bilan to'la papka bilan ishlayotgan bo'lsangiz va sizga faqat muayyan formatdagi fayllar kerak bo'lsa, glob juda mos keladi.

import glob 

# Find all images in the current directory
images = glob.glob('*.png')
print(images)
# ['image001.png', 'image002.png', 'image005.png'] 

# Find CSV files with specific naming
reports = glob.glob('report_202?.csv')
print(reports)
# ['report_2023.csv', 'report_2024.csv']

Rasmlarni oddiy glob bilan moslashtirish

Bu misolda glob.glob() funksiyasi mos kelgan path'larni ifodalovchi string'lar list'ini qaytaradi. Agar pattern'ga birorta fayl mos kelmasa, u hech qanday xato yoki exception ko'tarmasdan shunchaki bo'sh list qaytaradi.

** yordamida rekursiv qidiruv

Amalda fayllar kamdan-kam hollarda bitta papkada tartibli joylashgan bo'ladi. Log'lar, generatsiya qilingan fayllar va yuklangan fayllar ko'pincha bir nechta papkaga tarqalib ketadi. Bunday hollarda ichki papkalarga chuqurroq kira oladigan qidiruv yondashuvi kerak bo'ladi.

Masalan, agar sizda kunlik log'larni sana va servis bo'yicha saqlaydigan logging tizimi bo'lsa, hammasini bir o'tishda skanerlash uchun rekursiv glob pattern'laridan foydalanishingiz mumkin.

# Find all JSON files in this directory and all subdirectories
json_files = glob.glob('**/*.json', recursive=True)
print(json_files)
# ['config.json', 'data/users.json', 'data/archive/backup.json'] 

# Find log files anywhere in the logs directory paths
all_logs = glob.glob('logs/**/*.log', recursive=True)

recursive=True bo'lmasa, ** pattern'i bitta * kabi ishlaydi va faqat joriy papkadagi fayllarga mos keladi. recursive=True o'rnatilishi glob'ga ko'rsatilgan path ostidagi butun papkalar daraxtini aylanib chiqishni buyuradi.

Flag bilan rekursiv pattern matching

E'tibor bering, minglab fayllar bo'lgan papkalar bilan ishlaganda rekursiv qidiruvlarni skanerlash ko'proq vaqt olishi va unumdorlikka ta'sir qilishi mumkin.

Absolute va relative path bo'yicha moslashtirish

glob'ning foydali xususiyatlaridan biri — u relative path'larni ham, absolute path'larni ham qo'llab-quvvatlaydi. Bu moslashuvchanlik foydali bo'lsa-da, chalkashlik manbai ham bo'lishi mumkin. Windows'da backslash'lar escape sequence sifatida o'qilmasligi uchun pattern'larni raw string sifatida yozing.

Relative path'lar joriy working directory asosida aniqlanadi. Bu kichik skriptlar yoki tezkor tajribalar uchun yaxshi ishlaydi, lekin production'da yoki kodni working directory o'zgarishi mumkin bo'lgan turli environment'lardan ishga tushirganda ishonchsiz bo'lib qolishi mumkin.

Absolute path'lar esa, aksincha, aniq bo'ladi, har doim bir xil joyga ishora qiladi va skript qayerdan ishga tushirilishidan qat'i nazar path spetsifikatsiyasiga amal qiladi.

import os 

# Current directory: /home/user/projects
files = glob.glob('data/*.csv')
# Returns paths relative to /home/user/projects
# ['data/records.csv', 'data/exports.csv'] 

# Using absolute paths
abs_files = glob.glob('/var/log/app/*.log')
# Returns full absolute paths
# ['/var/log/app/error.log', '/var/log/app/access.log']

Yaxshi amaliy qoida: tezkor skriptlar va nazorat ostidagi environment'lar uchun relative path'lardan, izchillik muhimroq bo'lgan vaziyatlarda, masalan, production tizimlarida esa absolute path'lardan foydalaning.

glob'ni pathlib bilan ishlatish

pathlib module'i glob bilan juda yaxshi uyg'unlashadi, chunki u obyektga yo'naltirilgan yondashuvdan foydalanadi. Bu odatda kodni oddiy string'lar bilan bevosita ishlashga qaraganda o'qish va qo'llab-quvvatlash uchun osonroq qiladi. Xom fayl path'lari bilan ishlash o'rniga siz Path obyektlari bilan ishlaysiz, ularni boshqarish esa soddaroq va intuitivroq.

from pathlib import Path 

# Using Path.glob()
data_dir = Path('data')
csv_files = data_dir.glob('*.csv')
for file in csv_files: 
    print(file) # Returns Path objects, not strings 

# Recursive search with Path.rglob()
all_python = Path('.').rglob('*.py')
for file in all_python: 
    print(file.absolute())

Path.glob() ham, Path.rglob() ham string'lar emas, balki Path obyektlarini qaytaradi. Bu sizga path'larni tozaroq boshqarish, ularni soddaroq birlashtirish va fayl amallarini zanjir qilib bog'laganda yaxshiroq o'qiluvchanlikni beradi.

glob'dan foydalanish — ishning faqat bir qismi. Python fayllarni qidirish va ular bilan ishlashning bir nechta usulini taklif qiladi, shuning uchun glob qachon to'g'ri vosita ekanini va qachon boshqa yondashuv yaxshiroq mos kelishi mumkinligini tushunish foydali.

glob'ning amaliy qo'llanilishi

Glob fayl nomlari biror pattern'ga amal qilganda va ularni boshqarish uchun ortiqcha mantiq yozishdan qochmoqchi bo'lganingizda o'zini ayniqsa yaxshi ko'rsatadi. U kundalik dasturlash vazifalarida tez-tez uchraydi, garchi buni har doim ham darhol sezmasangiz ham.

glob'ning amaliy qo'llanilishi

Ma'lumotlarni qayta ishlash pipeline'lari

Bu glob'ning eng keng tarqalgan use case'laridan biri. Data analyst yoki data engineer sifatida siz ko'pincha har soatda yoki har kuni kelib tushadigan Excel, CSV yoki JSON fayllar bilan to'la papkalar bilan ishlaysiz. Bu kelib tushadigan fayllar soni yoki nomlanishi jihatidan kamdan-kam hollarda bir xil bo'ladi, bu esa qat'iy fayl nomlariga yoki o'zgarmas taxminlarga tayanadigan skriptlarni osongina buzishi mumkin.

Fayl nomlarini hardcode qilish va statik moslashtirishga tayanish o'rniga glob pattern'ga mos keladigan hamma narsani olish, uni qayta ishlash va keyingisiga o'tish imkonini beradi.

Log tahlili va monitoring

Vebda, cloud'da yoki mobil qurilmalarda ishlaydigan ilovalar katta hajmdagi log'larni generatsiya qiladi. Bu log'lar ko'pincha rotate qilinadi yoki timestamp, servis yoki environment bo'yicha guruhlanadi. glob qancha fayl yaratilgani yoki ular papkalar daraxtining qayerida joylashgani haqida qayg'urmasdan, berilgan vaqt oralig'idagi barcha tegishli log fayllarni tezda yig'ib olish imkonini beradi.

Fayllar ustida batch amallar

glob'ning yana bir keng tarqalgan use case'i — fayllar ustidagi ommaviy amallarni avtomatlashtirish. Eski backup'larni tozalash, asset'larni siqish yoki fayllarni qayta nomlash kabi vazifalar fayllarni pattern bo'yicha tanlay olganingizda ancha soddalashadi.

Build tizimlari va deployment workflow'lari

glob ko'pincha build va deployment skriptlarida kompilyatsiya qilingan artifact'lar, konfiguratsiya fayllari yoki statik resurslar kabi asset'larni topish uchun ishlatiladi. U har safar yangi fayl qo'shilganda skriptlarni yangilash zaruratini kamaytiradi, bu esa deployment mantiqini tozaroq va qo'llab-quvvatlashni osonroq saqlaydi.

Avtomatlashtirish va job'lar

Skriptlar jadval bo'yicha ishga tushganda fayllar va boshqa artifact'larning aniq to'plami bir ishga tushirishdan keyingisiga o'zgarib turadi. Skriptlar ishga tushgan paytda nima mavjud ekaniga qarab avtomatik moslashishi kerak.

glob bu turdagi avtomatlashtirishga hamda ma'lumotlarni arxivlash, fayllarni tizimlar o'rtasida sinxronlash yoki hisobotlarni yuklash bilan bog'liq bo'lishi mumkin bo'lgan cron job'larga tabiiy ravishda mos tushadi. U bu skriptlarga doimiy yangilanishlarni talab qilmasdan moslashuvchan bo'lib qolish imkonini beradi.

glob'dan amaliy stsenariylarda foydalana boshlaganingizdan so'ng bir nechta takrorlanuvchi holatlar va xatolar paydo bo'ladi. Bu keng tarqalgan xatolar va sizni vaqt yo'qotish hamda asabiylashishdan saqlab qoladigan best practice'larni ko'rib chiqish uchun ayni payt.

Keng tarqalgan xatolar va best practice'lar

glob'dan foydalanish oson va bu soddalik ba'zan undan noto'g'ri foydalanishni ham osonlashtiradi. Siz duch keladigan muammolarning aksariyati glob'ning o'zidan emas, balki uning qanday ishlashi haqidagi taxminlardan kelib chiqadi. Keng tarqalgan tuzoqlarni bilish vaqtingizni tejaydi va kodingizni oldindan aytib bo'ladigan qiladi.

glob har doim natija qaytaradi deb hisoblash

glob va umuman pattern matching kutubxonalari bilan bog'liq tez-tez uchraydigan xato — qidiruv har doim natija qaytaradi deb hisoblash. Bu har doim ham shunday emas. Pattern'ga birorta fayl mos kelmasa, glob bo'sh list qaytaradi. Bu shuni anglatadiki, kodingizning keyingi qismlarida kutilmagan holatlar yoki kutilmagan xatti-harakatlarning oldini olish uchun har doim natija uzunligini tekshirishingiz yoki fallback taqdim etishingiz kerak.

Relative path'larga tayanish

glob juda moslashuvchan module, lekin bu ham muammo bo'lishi mumkin. Relative path'larga haddan tashqari tayanish skriptlar turli environment'larda ishga tushirilganda ularning buzilishiga olib kelishi mumkin. Bu ko'pincha working directory development, testing va production o'rtasida o'zgarganda sodir bo'ladi.

Xavfsizroq yondashuv — path'larni dinamik ravishda qurish yoki asosiy papkalarni aniq ko'rsatish, ayniqsa kodingiz bir nechta environment'da ishlashi kerak bo'lganda.

Wildcard'larning ishlashini noto'g'ri tushunish

*, ? va [] uchun glob sintaksisi regular expression'larga o'xshab ko'rinishi mumkin, bu esa ularga bir xil munosabatda bo'lish istagini uyg'otadi. Ular bir xil emas. glob pattern'lari soddaroq va boshqacha ishlaydi.

glob'dan samarali foydalanish bu wildcard'lar nimani qila olishi va nimani qila olmasligini tushunish hamda ulardan to'liq regular expression xatti-harakatini kutmasdan, kuchli tomonlariga qarab foydalanishni anglatadi.

Haddan tashqari keng pattern'lar

glob og'ir ishni o'z zimmasiga olsa-da, hamma narsani bir urinishda qidirish istagi paydo bo'lishi mumkin. Bu keng tarqalgan tuzoq. **/* kabi pattern'lar juda katta papkalar daraxtini skanerlashi va unumdorlikka zarar yetkazishi mumkin, ayniqsa production environment'larida.

Odatda qidiruvni papka, fayl kengaytmasi yoki nomlash konvensiyasi bo'yicha toraytirgan ma'qul, shunda fayl tizimini skanerlash aniq yo'naltirilgan va samarali bo'lib qoladi.

Qidiruv natijalarini noto'g'ri ishlatish

Yana bir keng tarqalgan muammo — glob sort qilingan natijalar yoki haqiqiy fayl obyektlarini qaytaradi deb hisoblash. Bunday emas. glob fayllarning o'zini emas, balki fayl path'lari string'laridan iborat sort qilinmagan list'ni qaytaradi. glob oddiy list qaytargani uchun uni boshqa har qanday list kabi sort qilishingiz yoki filter() qilishingiz mumkin.

Agar sizga muayyan tartib kerak bo'lsa, natijalarni qo'lda sort qilishingiz kerak. Agar fayllarni o'qish yoki qayta ishlashni xohlasangiz, ularni baribir aniq ochishingiz kerak bo'ladi. glob natijalarini foydalanishga tayyor fayl obyektlari deb hisoblash — tushib qolmasligingiz kerak bo'lgan tuzoq.

Xulosa

glob module'i fayl tizimini avtomatlashtirish va pattern'ga asoslangan qidiruv uchun kuchli vosita. Data pipeline'lar qurayotgan bo'lasizmi, eski fayllarni tozalayapsizmi yoki o'xshash hujjatlar to'plamini qayta ishlayapsizmi, glob sizga shell'da ishlatadigan wildcard moslashtirishning o'zini bevosita Python skriptlaringiz ichida beradi.

Agar glob bilan ko'proq amaliyot qilishni xohlasangiz, quyidagi prompt'dan foydalaning yoki uning barcha imkoniyatlarini bilib olish uchun AI Tutor'ning maxsus sahifasiga kiring:

Tuzilmaliroq o'rganish yo'li va glob kengroq Python ekotizimiga qanday mos tushishini chuqurroq tushunish uchun Python roadmap'ini ham ko'rib chiqishingiz mumkin.

Yo'l xaritalariQo'llanmalarFAQYouTube

yo'lxaritaroadmap.shasosida

Hamjamiyat tomonidan yaratilgan yo'l xaritalari, eng yaxshi amaliyotlar, loyihalar, maqolalar, manbalar va yo'nalishlar — o'z yo'lingizni tanlash va kasbingizda o'sish uchun.

© yo'lxarita·Shartlar·Maxfiylik·

roadmap.sh

Barcha kontent roadmap.sh loyihasidan olingan (© Kamran Ahmed) va shaxsiy o'rganish uchun o'zbek tiliga tarjima qilinmoqda.

Qidiruv

Yo'l xaritalari, loyihalar va savollarni qidiring