یک بخش از کار با داده ها ایمپورت کردن فایل هاست. وقتی که تعداد فایل ها کم باشه خب کارمون راحته اما اگر تعداد فایل ها زیاد باشه و شما دنبال مثلا الگوی یک سال خاص یا یک کلیدواژه خاص هستید چی؟
glob از مهم ترین ابزار های پیدا کردن فایل با الگو های متفاوت در پایتون هست ساختار های تو در تو رو چطوری رعایت میکنید؟ یکی از ابزار هایی که به صورت پیشفرض در پایتون حضور داره glob هست که به شما این امکان رو میده با استفاده از یک سری قواعد بتونید فایل هاتون رو پیدا کنید و موقع ایمپورت کردن راحت باشید.
ابتدا بذارید دیتاستی که هستش و لیست فایل هایی که داریم رو بررسی کنیم برای این کار برای بررسی dask من مقدار زیادی داده یعنی ۷۸ گیگابیت از داده های تاکسی های شهر نیویورک رو دانلود کردم در سال های متفاوت و دسته های متفاوت.
لینک دانلود یا بررسی دیتاست تاکسی های نیویورک
الگوهایی که در فایل ها داریم داریم: نوع تاکسی
سال:
در بازه 2009 تا 2020
ماه:
در بازه 1 تا 12 بر اساس ماه های میلادی
من چون کل دیتاست رو ندارم ( یعنی حافظه و اینترنت برای دانلود کلش و پردازنده برای پردازش کلش رو هم ندارم)
بیاییم ببینیم چیا داریم توی این پوشه:
روش os.listdir برای شروع یکی از کتابخونه هایی که بهمون کمک میکنه لیست یک دایرکتوری رو بگیرم استفاده میکنیم البته اگر توی محیط jupyter notebook هستید میتونید از توابع مجیک استفاده کنید.
os. listdir( './datasets' )
خروجی اون:
\['yellow\tripdata\2019-03.csv',
'yellow\tripdata\2009-03.csv',
'fhv\tripdata\2017-09.csv',
'fhv\tripdata\2015-04.csv',
'yellow\tripdata\2019-11.csv',
'fhv\tripdata\2017-03.csv',
'fhv\tripdata\2020-03.csv',
'fhv\tripdata\2017-02.csv',
'yellow\tripdata\2009-08.csv',
'fhv\tripdata\2019-10.csv',
'yellow\tripdata\2009-01.csv',
'green\tripdata\2019-07.csv',
'yellow\tripdata\2019-07.csv',
'fhv\tripdata\2017-12.csv',
'fhv\tripdata\2015-05.csv',
'fhv\tripdata\2016-08.csv',
'yellow\tripdata\2009-10.csv',
'fhv\tripdata\2020-05.csv',
'yellow\tripdata\2009-05.csv',
'fhv\tripdata\2015-01.csv',
'fhv\tripdata\2016-04.csv',
'fhv\tripdata\2016-05.csv',
'fhv\tripdata\2018-08.csv',
'fhv\tripdata\2017-10.csv',
'green\tripdata\2019-11.csv',
'fhv\tripdata\2019-02.csv',
'green\tripdata\2019-08.csv',
'links.txt',
'fhv\tripdata\2016-12.csv',
'yellow\tripdata\2009-09.csv',
'fhv\tripdata\2017-05.csv',
'fhv\tripdata\2015-03.csv',
'fhv\tripdata\2015-09.csv',
'yellow\tripdata\2019-12.csv',
'fhv\tripdata\2016-11.csv',
'green\tripdata\2019-01.csv',
'fhv\tripdata\2016-09.csv',
'yellow\tripdata\2019-01.csv',
'yellow\tripdata\2019-06.csv',
'fhv\tripdata\2019-09.csv',
'fhv\tripdata\2019-11.csv',
'fhv\tripdata\2019-05.csv',
'fhv\tripdata\2017-04.csv',
'yellow\tripdata\2019-09.csv',
'yellow\tripdata\2009-04.csv',
'fhv\tripdata\2017-07.csv',
'yellow\tripdata\2009-11.csv',
'yellow\tripdata\2019-08.csv',
'yellow\tripdata\2009-07.csv',
'fhv\tripdata\2015-08.csv',
'fhv\tripdata\2018-10.csv',
'fhv\tripdata\2018-09.csv',
'fhv\tripdata\2018-12.csv',
'fhv\tripdata\2018-02.csv',
'fhv\tripdata\2017-06.csv',
'fhv\tripdata\2019-06.csv',
'fhv\tripdata\2016-02.csv',
'fhv\tripdata\2018-01.csv',
'yellow\tripdata\2019-05.csv',
'yellow\tripdata\2019-02.csv',
'fhv\tripdata\2020-02.csv',
'green\tripdata\2019-10.csv',
'fhv\tripdata\2017-11.csv',
'fhv\tripdata\2018-04.csv',
'fhv\tripdata\2015-11.csv',
'fhv\tripdata\2015-10.csv',
'fhv\tripdata\2015-12.csv',
'yellow\tripdata\2019-04.csv',
'green\tripdata\2019-06.csv',
'fhv\tripdata\2019-12.csv',
'links\yellow.txt',
'fhv\tripdata\2016-10.csv',
'fhv\tripdata\2020-04.csv',
'fhv\tripdata\2017-01.csv',
'fhv\tripdata\2015-02.csv',
'green\tripdata\2019-09.csv',
'fhv\tripdata\2016-01.csv',
'yellow\tripdata\2009-12.csv',
'fhv\tripdata\2019-03.csv',
'fhv\tripdata\2015-06.csv',
'fhv\tripdata\2019-04.csv',
'green\tripdata\2019-05.csv',
'yellow\tripdata\2009-02.csv',
'yellow\tripdata\2009-06.csv',
'fhv\tripdata\2015-07.csv',
'fhv\tripdata\2018-03.csv',
'fhv\tripdata\2019-08.csv',
'fhv\tripdata\2018-11.csv',
'fhv\tripdata\2017-08.csv',
'fhv\tripdata\2018-06.csv',
'fhv\tripdata\2018-05.csv',
'fhv\tripdata\2016-06.csv',
'fhv\tripdata\2020-01.csv',
'fhv\tripdata\2018-07.csv',
'fhv\tripdata\2016-03.csv',
'green\tripdata\2019-12.csv',
'links\green.txt',
'fhv\tripdata\2016-07.csv',
'fhv\tripdata\2019-07.csv',
'fhv\tripdata\2020-06.csv',
'green\tripdata\2019-04.csv',
'yellow\tripdata\2019-10.csv',
'fhv\tripdata\2019-01.csv',
'green\tripdata\2019-03.csv',
'green\tripdata\2019-02.csv'\]
این خروجی ما هستش که یک سری فایل csv داریم و یک سری فایل متنی که لینک های ماست. ساده ترین راه فیلتر کردن متن هستش که میتونیم این خروجی os.listdir رو در یک متغییر ذخیره کنیم و پیش بریم
فیلتر کردن لیست فایل ها با os.listdir با توجه به الگو هایی که در اول متن داشتیم یک فیلتر ساده انجام بدیم که لیست فایل هایی رو بر گردونه که حاوی yellow هستن در ابتداشون و توی متغییر ls\dir ذخیره کنم
ls_dir = [ file_name for file_name in os. listdir( base_path) if 'yellow_' in file_name] ls_dir
که به ما خروجی:
\['yellow\tripdata\2019-03.csv',
'yellow\tripdata\2009-03.csv',
'yellow\tripdata\2019-11.csv',
'yellow\tripdata\2009-08.csv',
'yellow\tripdata\2009-01.csv',
'yellow\tripdata\2019-07.csv',
'yellow\tripdata\2009-10.csv',
'yellow\tripdata\2009-05.csv',
'yellow\tripdata\2009-09.csv',
'yellow\tripdata\2019-12.csv',
'yellow\tripdata\2019-01.csv',
'yellow\tripdata\2019-06.csv',
'yellow\tripdata\2019-09.csv',
'yellow\tripdata\2009-04.csv',
'yellow\tripdata\2009-11.csv',
'yellow\tripdata\2019-08.csv',
'yellow\tripdata\2009-07.csv',
'yellow\tripdata\2019-05.csv',
'yellow\tripdata\2019-02.csv',
'yellow\tripdata\2019-04.csv',
'yellow\tripdata\2009-12.csv',
'yellow\tripdata\2009-02.csv',
'yellow\tripdata\2009-06.csv',
'yellow\tripdata\2019-10.csv'\]
رو میده اما مشکلات کم کم نمود پیدا میکنند.
معایب استفاده از os.listdir سخت بودن پیدا کردن الگو های پیچیده خوانایی کمتر نسبت به glob ما فقط لیست فایل ها رو میگیرم نه ادرس کامل یا نسبی اون رو سلام کنید به glob دستیار همه کاره
این همه گفتیم بیاییم ببینیم glob چی چیه اصلا؟
دیدن glob در داکیومنت های زبان پایتون
در اینجا منظور glob.glob است. کتابخونه glob در پایتون فانکشن های دیگری هم داره.
با استفاده از glob میتونیم به جای صرفا ارسال یک دایرکتوری الگوهایی که هستند رو (شبیه) regex بدیم و با حد زیادی باعث میشه که سریع تر و راحتر الگو ها رو پیدا کنیم.
بیاییم کم کم پیش بریم نگران نباشید یکم پایین تر چیت شیت اختصاصی اون رو براتون قرار دادم میتونید دانلود کنید.
اولین قاعده glob ”*” اولین عبارتی که توی glob باید بدانید ”*” است که تقریبا هم معنای هر چیزیست به هر اندازه ای هست.
خب بیایید هر چیزی که به .csv ختم میشه رو در بیاریم:
*ما برای استفاده تابع glob در پکیچ glob اون رو به اسم glb ایمپورت میکنیم
from glob import glob as glb
glb( './datasets/\*.csv' )
که خروجی اون میشه
\['./datasets/yellow\tripdata\2019-03.csv',
'./datasets/yellow\tripdata\2009-03.csv',
'./datasets/fhv\tripdata\2017-09.csv',
'./datasets/fhv\tripdata\2015-04.csv',
'./datasets/yellow\tripdata\2019-11.csv',
'./datasets/fhv\tripdata\2017-03.csv',
'./datasets/fhv\tripdata\2020-03.csv',
'./datasets/fhv\tripdata\2017-02.csv',
'./datasets/yellow\tripdata\2009-08.csv',
'./datasets/fhv\tripdata\2019-10.csv',
'./datasets/yellow\tripdata\2009-01.csv',
'./datasets/green\tripdata\2019-07.csv',
'./datasets/yellow\tripdata\2019-07.csv',
'./datasets/fhv\tripdata\2017-12.csv',
'./datasets/fhv\tripdata\2015-05.csv',
'./datasets/fhv\tripdata\2016-08.csv',
'./datasets/yellow\tripdata\2009-10.csv',
'./datasets/fhv\tripdata\2020-05.csv',
'./datasets/yellow\tripdata\2009-05.csv',
'./datasets/fhv\tripdata\2015-01.csv',
'./datasets/fhv\tripdata\2016-04.csv',
'./datasets/fhv\tripdata\2016-05.csv',
'./datasets/fhv\tripdata\2018-08.csv',
'./datasets/fhv\tripdata\2017-10.csv',
'./datasets/green\tripdata\2019-11.csv',
'./datasets/fhv\tripdata\2019-02.csv',
'./datasets/green\tripdata\2019-08.csv',
'./datasets/fhv\tripdata\2016-12.csv',
'./datasets/yellow\tripdata\2009-09.csv',
'./datasets/fhv\tripdata\2017-05.csv',
'./datasets/fhv\tripdata\2015-03.csv',
'./datasets/fhv\tripdata\2015-09.csv',
'./datasets/yellow\tripdata\2019-12.csv',
'./datasets/fhv\tripdata\2016-11.csv',
'./datasets/green\tripdata\2019-01.csv',
'./datasets/fhv\tripdata\2016-09.csv',
'./datasets/yellow\tripdata\2019-01.csv',
'./datasets/yellow\tripdata\2019-06.csv',
'./datasets/fhv\tripdata\2019-09.csv',
'./datasets/fhv\tripdata\2019-11.csv',
'./datasets/fhv\tripdata\2019-05.csv',
'./datasets/fhv\tripdata\2017-04.csv',
'./datasets/yellow\tripdata\2019-09.csv',
'./datasets/yellow\tripdata\2009-04.csv',
'./datasets/fhv\tripdata\2017-07.csv',
'./datasets/yellow\tripdata\2009-11.csv',
'./datasets/yellow\tripdata\2019-08.csv',
'./datasets/yellow\tripdata\2009-07.csv',
'./datasets/fhv\tripdata\2015-08.csv',
'./datasets/fhv\tripdata\2018-10.csv',
'./datasets/fhv\tripdata\2018-09.csv',
'./datasets/fhv\tripdata\2018-12.csv',
'./datasets/fhv\tripdata\2018-02.csv',
'./datasets/fhv\tripdata\2017-06.csv',
'./datasets/fhv\tripdata\2019-06.csv',
'./datasets/fhv\tripdata\2016-02.csv',
'./datasets/fhv\tripdata\2018-01.csv',
'./datasets/yellow\tripdata\2019-05.csv',
'./datasets/yellow\tripdata\2019-02.csv',
'./datasets/fhv\tripdata\2020-02.csv',
'./datasets/green\tripdata\2019-10.csv',
'./datasets/fhv\tripdata\2017-11.csv',
'./datasets/fhv\tripdata\2018-04.csv',
'./datasets/fhv\tripdata\2015-11.csv',
'./datasets/fhv\tripdata\2015-10.csv',
'./datasets/fhv\tripdata\2015-12.csv',
'./datasets/yellow\tripdata\2019-04.csv',
'./datasets/green\tripdata\2019-06.csv',
'./datasets/fhv\tripdata\2019-12.csv',
'./datasets/fhv\tripdata\2016-10.csv',
'./datasets/fhv\tripdata\2020-04.csv',
'./datasets/fhv\tripdata\2017-01.csv',
'./datasets/fhv\tripdata\2015-02.csv',
'./datasets/green\tripdata\2019-09.csv',
'./datasets/fhv\tripdata\2016-01.csv',
'./datasets/yellow\tripdata\2009-12.csv',
'./datasets/fhv\tripdata\2019-03.csv',
'./datasets/fhv\tripdata\2015-06.csv',
'./datasets/fhv\tripdata\2019-04.csv',
'./datasets/green\tripdata\2019-05.csv',
'./datasets/yellow\tripdata\2009-02.csv',
'./datasets/yellow\tripdata\2009-06.csv',
'./datasets/fhv\tripdata\2015-07.csv',
'./datasets/fhv\tripdata\2018-03.csv',
'./datasets/fhv\tripdata\2019-08.csv',
'./datasets/fhv\tripdata\2018-11.csv',
'./datasets/fhv\tripdata\2017-08.csv',
'./datasets/fhv\tripdata\2018-06.csv',
'./datasets/fhv\tripdata\2018-05.csv',
'./datasets/fhv\tripdata\2016-06.csv',
'./datasets/fhv\tripdata\2020-01.csv',
'./datasets/fhv\tripdata\2018-07.csv',
'./datasets/fhv\tripdata\2016-03.csv',
'./datasets/green\tripdata\2019-12.csv',
'./datasets/fhv\tripdata\2016-07.csv',
'./datasets/fhv\tripdata\2019-07.csv',
'./datasets/fhv\tripdata\2020-06.csv',
'./datasets/green\tripdata\2019-04.csv',
'./datasets/yellow\tripdata\2019-10.csv',
'./datasets/fhv\tripdata\2019-01.csv',
'./datasets/green\tripdata\2019-03.csv',
'./datasets/green\tripdata\2019-02.csv'\]
همانطور که اینجا هستش ما با یک خط تمام فایل های csv رو گرفتیم همراه با path (مسیر) اونها درحالی که این برای os.listdir یک مشکل بودش.
حالا بیاییم و اون لیست تمام فایل هایی که با yellow شروع میشن و به .csv ختم میشن رو بگیریم:
glb( './datasets/yellow\*.csv' )
که خروجی اون میشه
\['./datasets/yellow\tripdata\2019-03.csv',
'./datasets/yellow\tripdata\2009-03.csv',
'./datasets/yellow\tripdata\2019-11.csv',
'./datasets/yellow\tripdata\2009-08.csv',
'./datasets/yellow\tripdata\2009-01.csv',
'./datasets/yellow\tripdata\2019-07.csv',
'./datasets/yellow\tripdata\2009-10.csv',
'./datasets/yellow\tripdata\2009-05.csv',
'./datasets/yellow\tripdata\2009-09.csv',
'./datasets/yellow\tripdata\2019-12.csv',
'./datasets/yellow\tripdata\2019-01.csv',
'./datasets/yellow\tripdata\2019-06.csv',
'./datasets/yellow\tripdata\2019-09.csv',
'./datasets/yellow\tripdata\2009-04.csv',
'./datasets/yellow\tripdata\2009-11.csv',
'./datasets/yellow\tripdata\2019-08.csv',
'./datasets/yellow\tripdata\2009-07.csv',
'./datasets/yellow\tripdata\2019-05.csv',
'./datasets/yellow\tripdata\2019-02.csv',
'./datasets/yellow\tripdata\2019-04.csv',
'./datasets/yellow\tripdata\2009-12.csv',
'./datasets/yellow\tripdata\2009-02.csv',
'./datasets/yellow\tripdata\2009-06.csv',
'./datasets/yellow\tripdata\2019-10.csv'\]
به همین سادگی بدون نیاز به پیمایش مجدد لیستمون کامله.
دومین قاعده glob ”?”
دومین عبارت ”?” است که به معنای هر چیزی اما به اندازه یک عدد است.
خب بگردیم به لیست فایلهامون ما میخواهیم همه فایل هایی که این الگو رو فقط در بیاریم
**fhv\tripdata\20yy-mm**
که فعلا کاری نداریم m و y چی هستن فقط هر چیزی میتونه باشه جاش. مثلا
**fhv\tripdata\20az-3k**
هم عضو این الگو میشه که بعدا با عملگر های بعدی اون رو هم درست میکنیم
glb( './datasets/fhv\tripdata\20??-??.csv' )
خروجی ما
\['./datasets/fhv\tripdata\2017-09.csv',
'./datasets/fhv\tripdata\2015-04.csv',
'./datasets/fhv\tripdata\2017-03.csv',
'./datasets/fhv\tripdata\2020-03.csv',
'./datasets/fhv\tripdata\2017-02.csv',
'./datasets/fhv\tripdata\2019-10.csv',
'./datasets/fhv\tripdata\2017-12.csv',
'./datasets/fhv\tripdata\2015-05.csv',
'./datasets/fhv\tripdata\2016-08.csv',
'./datasets/fhv\tripdata\2020-05.csv',
'./datasets/fhv\tripdata\2015-01.csv',
'./datasets/fhv\tripdata\2016-04.csv',
'./datasets/fhv\tripdata\2016-05.csv',
'./datasets/fhv\tripdata\2018-08.csv',
'./datasets/fhv\tripdata\2017-10.csv',
'./datasets/fhv\tripdata\2019-02.csv',
'./datasets/fhv\tripdata\2016-12.csv',
'./datasets/fhv\tripdata\2017-05.csv',
'./datasets/fhv\tripdata\2015-03.csv',
'./datasets/fhv\tripdata\2015-09.csv',
'./datasets/fhv\tripdata\2016-11.csv',
'./datasets/fhv\tripdata\2016-09.csv',
'./datasets/fhv\tripdata\2019-09.csv',
'./datasets/fhv\tripdata\2019-11.csv',
'./datasets/fhv\tripdata\2019-05.csv',
'./datasets/fhv\tripdata\2017-04.csv',
'./datasets/fhv\tripdata\2017-07.csv',
'./datasets/fhv\tripdata\2015-08.csv',
'./datasets/fhv\tripdata\2018-10.csv',
'./datasets/fhv\tripdata\2018-09.csv',
'./datasets/fhv\tripdata\2018-12.csv',
'./datasets/fhv\tripdata\2018-02.csv',
'./datasets/fhv\tripdata\2017-06.csv',
'./datasets/fhv\tripdata\2019-06.csv',
'./datasets/fhv\tripdata\2016-02.csv',
'./datasets/fhv\tripdata\2018-01.csv',
'./datasets/fhv\tripdata\2020-02.csv',
'./datasets/fhv\tripdata\2017-11.csv',
'./datasets/fhv\tripdata\2018-04.csv',
'./datasets/fhv\tripdata\2015-11.csv',
'./datasets/fhv\tripdata\2015-10.csv',
'./datasets/fhv\tripdata\2015-12.csv',
'./datasets/fhv\tripdata\2019-12.csv',
'./datasets/fhv\tripdata\2016-10.csv',
'./datasets/fhv\tripdata\2020-04.csv',
'./datasets/fhv\tripdata\2017-01.csv',
'./datasets/fhv\tripdata\2015-02.csv',
'./datasets/fhv\tripdata\2016-01.csv',
'./datasets/fhv\tripdata\2019-03.csv',
'./datasets/fhv\tripdata\2015-06.csv',
'./datasets/fhv\tripdata\2019-04.csv',
'./datasets/fhv\tripdata\2015-07.csv',
'./datasets/fhv\tripdata\2018-03.csv',
'./datasets/fhv\tripdata\2019-08.csv',
'./datasets/fhv\tripdata\2018-11.csv',
'./datasets/fhv\tripdata\2017-08.csv',
'./datasets/fhv\tripdata\2018-06.csv',
'./datasets/fhv\tripdata\2018-05.csv',
'./datasets/fhv\tripdata\2016-06.csv',
'./datasets/fhv\tripdata\2020-01.csv',
'./datasets/fhv\tripdata\2018-07.csv',
'./datasets/fhv\tripdata\2016-03.csv',
'./datasets/fhv\tripdata\2016-07.csv',
'./datasets/fhv\tripdata\2019-07.csv',
'./datasets/fhv\tripdata\2020-06.csv',
'./datasets/fhv\tripdata\2019-01.csv'\]
که همه فایل هایی که با این الگو هماهنگ هستند رو در میاره
یک مشکلی اگر که بخواهیم الگو رو دقیق تر کنیم چی؟ که میرسیم به بخش بعدی
سومین قاعده glob ”[ ]” خب تا الان ما تونسیتم لیست رو بگیریم و نهایتا محدود کنیم به یک عدد اما یک مشکلی که هستش با ”* ” و ”? ” هر مقدار یا یک عدد از هر چیزی رو قبول میکردن و مثلا این الگو اشتباه
fhv\tripdata\20az-3k.csv
با توجه به glob
glb('./datasets/fhv\tripdata\20??-??.csv')
کاملا درست بودش.
برگردیم من گفتم که ما تاریخ هامون یک بازه ای دارن و این بازه عدد هستش.
برای اینکه بتونیم این قاعده رو اضافه کنیم باید از براکت استفاده کنیم.
که حدودا به این شکل ها میتونیم استفاده کنیم:
البته توی بخش برگه تقلب لیست کامل تری اوردم براتون
بیایم و عبارت glob بنویسم که تمام فایل هایی که با fhv شروع میشن و بازه 2015 تا 2019 رو شامل میشه و ماه های زوج میلادی یعنی 2,4,6,8,10,12
** glb( './datasets/fhv\tripdata\201\[5-9\]-?\[2458\].csv' ) **
و خروجی اون
\['./datasets/fhv\tripdata\2015-04.csv',
'./datasets/fhv\tripdata\2017-02.csv',
'./datasets/fhv\tripdata\2017-12.csv',
'./datasets/fhv\tripdata\2015-05.csv',
'./datasets/fhv\tripdata\2016-08.csv',
'./datasets/fhv\tripdata\2016-04.csv',
'./datasets/fhv\tripdata\2016-05.csv',
'./datasets/fhv\tripdata\2018-08.csv',
'./datasets/fhv\tripdata\2019-02.csv',
'./datasets/fhv\tripdata\2016-12.csv',
'./datasets/fhv\tripdata\2017-05.csv',
'./datasets/fhv\tripdata\2019-05.csv',
'./datasets/fhv\tripdata\2017-04.csv',
'./datasets/fhv\tripdata\2015-08.csv',
'./datasets/fhv\tripdata\2018-12.csv',
'./datasets/fhv\tripdata\2018-02.csv',
'./datasets/fhv\tripdata\2016-02.csv',
'./datasets/fhv\tripdata\2018-04.csv',
'./datasets/fhv\tripdata\2015-12.csv',
'./datasets/fhv\tripdata\2019-12.csv',
'./datasets/fhv\tripdata\2015-02.csv',
'./datasets/fhv\tripdata\2019-04.csv',
'./datasets/fhv\tripdata\2019-08.csv',
'./datasets/fhv\tripdata\2017-08.csv',
'./datasets/fhv\tripdata\2018-05.csv'\]
و به همین راحتی با ترکیب ”*” , ”?” و ”[ ]” یک سری قاعده خیلی پیچیده ساختیم.
این بود سه قاعده اصلی استفاده از glob و این هم از چیت شیتی که گفته بودم
لینک دانلود