ما در قسمتهای قبل تا جایی پیش اومدیم که یک پکیج ساختیم و اون پکیج رو استفاده کردیم اما هنوز بسیار با مرحلهای که شبیه بیشتر پکیجهای پایتونی باشه فاصله داریم در نتیجه در این مرحله زیرپکیجها (Subpackages) رو بررسی میکنیم و ازشون استفاده میکنیم.
در این مرحله اسم فولدری که ساخته بودیم رو از package_root به demo_reader تغییر بدید
در محل demo_reader یک فولدر جدید با اسم compressed بسازید که میشه اولین سابپکیج ما
مثل مرحله ساختن یک پکیج ما داخل این فولدر یک فایل __init__ میسازیم و توش هر چیزی که میخوایم رو مینویسیم، توی مرحلههای قبلی توضیح دادیم که این فرمت اجباری نیست ولی کمک میکنه کسی که داره کدمارو هر جایی میخونه بفهمه چرا این کد این شکلی کار میکنه و یک پکیج هستش.
بعد از ساختن compressed یک فایل gzipped.py میسازیم که داخل اون محتویات زیر رو قرار میدیم
import gzip import sys opener = gzip.open if __name__ == '__main__': f = gzip.open(sys.argv[1], 'wt') f.write(' '.join(sys.argv[2:])) f.close()
همچنین یک فایل دیگه هم میسازیم با اسم bzipped.py که محتویات زیر رو داخلش قرار میدیم
import bz2 import sys opener = bz2.open if __name__ == '__main__': f = bz2.open(sys.argv[1], 'wt') f.write(' '.join(sys.argv[2:])) f.close()
حالا یک فایل جدید ایجاد کنید به اسم multi_reader.py با محتویات زیر
import os from demo_reader.compressed import bzipped,gzipped extension_map = { '.bz2': bzipped.opener, '.gz': gzipped.opener } class MultiReader: def __init__(self, filename): extension = os.path.splitext(filename)[1] opener = extension_map.get(extension, open) self.f = opener(filename, 'rt') def close(self): self.f.close() def read(self): return self.f.read()
بسیار شبیه قسمت دوم و سوم هستش با تفاوت اینکه امکان خوندن فایلهای bz2 و gz رو هم اضافه کردیم
اگر طبق آموزشهای قبلی محلی که ساختید رو به syspath اضافه کرده باشید میتونید از دستور زیر جهت ایجاد یک نمونه فایل برای تست کدتون استفاده کنید
python3 -m demo_reader.compressed.bzippped test.bz2 data compressed with bzip
تیکههای مختلفی داره این کد شامل این که از پکیج demo_reader سابپکیج compressed فانکشن bzipped استفاده میکنیم و تیکه کد پایین که میگه اگه arg دوم پاس داده شده بود(محل نوشتن فایل) رو استفاده کن
f.write(' '.join(sys.argv[2:]))
خب حالا برای این که ببینم آیا چیزهایی که نوشتیم درست کار میکنه یا نه
دستورات زیر رو مینویسیم
python3
import sys
sys.path.append("addtosyspath")
from demo_reader.multi_reader import MultiReader
r = MultiReader("test.bz2")
r.read()
r.close()
با در صورتی که کارهارو درست انجام داده باشید باید data compressed with bzip رو مشاهده کنید
امیدوارم که از این قسمت خوشتون اومده باشه
در صورتی که سوالی دارید توی کامنتها بپرسید