Meni har doim elektron kutubxonamdagi kitoblarni qanday qilib eng yaxshi tarzda tarqatish qiziqtirgan. Oxir-oqibat, men ushbu variantga sahifalar sonini va boshqa yaxshi narsalarni avtomatik hisoblash bilan keldim. Men barcha qiziquvchilardan mushuk ostida so'rayman.
1-qism. Dropbox
Mening barcha kitoblarim dropbox-da. Men hamma narsani 4 toifaga ajratdim: Darslik, Ma'lumotnoma, Badiiy adabiyot, Badiiy adabiyot. Lekin men jadvalga ma'lumotnomalarni qo'shmayman.
Kitoblarning aksariyati .epub, qolganlari .pdf. Ya'ni, yakuniy yechim qandaydir tarzda ikkala variantni ham qamrab olishi kerak.
Mening kitoblarga bo'lgan yo'llarim quyidagicha:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Agar kitob fantastika bo'lsa, unda toifa (ya'ni yuqoridagi holatda "Dizayn") olib tashlanadi.
Men Dropbox API bilan bezovta qilmaslikka qaror qildim, chunki menda jildni sinxronlashtiradigan ularning ilovasi bor. Ya'ni, reja shunday: biz papkadan kitoblarni olib, har bir kitobni so'z hisoblagichidan o'tkazamiz va uni Notionga qo'shamiz.
2-qism. Bir qator qo'shing
Jadvalning o'zi shunday ko'rinishi kerak. DIQQAT: ustun nomlarini lotin tilida yozgan ma'qul.
Biz norasmiy Notion API dan foydalanamiz, chunki rasmiy API hali yetkazilmagan.
Notion-ga o'ting, Ctrl + Shift + J tugmalarini bosing, Ilova -> Cookie-ga o'ting, token_v2-dan nusxa oling va uni TOKEN deb nomlang. Keyin kutubxona belgisi bilan kerakli sahifaga o'tamiz va havolani nusxalaymiz. Biz buni NOTION deb ataymiz.
Keyin Notion-ga ulanish uchun kodni yozamiz.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Keyinchalik, jadvalga qator qo'shish funksiyasini yozamiz.
def add_row(path, file, words_count, pages_count, hours):
row = database.collection.add_row()
row.title = file
tags = path.split("/")
if len(tags) >= 1:
row.what = tags[0]
if len(tags) >= 2:
row.state = tags[1]
if len(tags) >= 3:
if tags[0] == "Художественное":
row.author = tags[2]
elif tags[0] == "Нехудожественное":
row.tags = tags[2]
elif tags[0] == "Учебники":
row.tags = tags[2]
if len(tags) >= 4:
row.author = tags[3]
row.hours = hours
row.pages = pages_count
row.words = words_count
Bu yerda nima bo'lyapti. Birinchi qatordagi jadvalga yangi qatorni olamiz va qo'shamiz. Keyinchalik, biz yo'limizni "/" bo'ylab ajratamiz va teglarni olamiz. Teglar - "San'at", "Dizayn", muallif kim va hokazo. Keyin plastinkaning barcha kerakli maydonlarini o'rnatamiz.
3-qism. So'zlarni, soatlarni va boshqa zavqlarni sanash
Bu qiyinroq vazifa. Esda tutganimizdek, bizda ikkita format mavjud: epub va pdf. Agar epub bilan hamma narsa aniq bo'lsa - so'zlar ehtimol u erda bo'lsa, unda pdf haqida hamma narsa unchalik aniq emas: u shunchaki yopishtirilgan tasvirlardan iborat bo'lishi mumkin.
Shunday qilib, PDF-dagi so'zlarni hisoblash funksiyamiz quyidagicha ko'rinadi: biz sahifalar sonini olamiz va ma'lum bir doimiyga ko'paytiramiz (har bir sahifadagi so'zlarning o'rtacha soni).
Mana u:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
A4 sahifasi uchun bu WORDS_PER_PAGE taxminan 300 ga teng.
Endi sahifalarni hisoblash funksiyasini yozamiz. foydalanamiz
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Keyinchalik, biz Epub-da sahifalarni hisoblash uchun biror narsa yozamiz. Biz foydalanamiz
def get_epub_pages_number(path, filename):
book = open_book(os.path.join(path, filename))
lines = convert_epub_to_lines(book)
words_count = 0
for line in lines:
words_count += len(line.split(" "))
return round(words_count / WORDS_PER_PAGE)
Endi vaqtni hisoblaylik. Biz sevimli so'zlar sonini olamiz va uni o'qish tezligiga bo'lamiz.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
4-qism. Barcha qismlarni ulash
Biz kitoblar papkamizdagi barcha mumkin bo'lgan yo'llarni bosib o'tishimiz kerak. Notion-da allaqachon kitob bor yoki yo'qligini tekshiring: agar mavjud bo'lsa, biz endi chiziq yaratishimiz shart emas.
Keyin fayl turini aniqlashimiz kerak, bunga qarab, so'zlar sonini hisoblaymiz. Oxirida kitob qo'shing.
Bu biz olgan kod:
for root, subdirs, files in os.walk(BOOKS_DIR):
if len(files) > 0 and check_for_excusion(root):
for file in files:
array = file.split(".")
filetype = file.split(".")[len(array) - 1]
filename = file.replace("." + filetype, "")
local_root = root.replace(BOOKS_DIR, "")
print("Dir: {}, file: {}".format(local_root, file))
if not check_for_existence(filename):
print("Dir: {}, file: {}".format(local_root, file))
if filetype == "pdf":
count = get_pdf_pages_number(root, file)
else:
count = get_epub_pages_number(root, file)
words_count = get_words_count(count)
hours = get_reading_time(words_count)
print("Pages: {}, Words: {}, Hours: {}".format(count, words_count, hours))
add_row(local_root, filename, words_count, count, hours)
Kitob qo'shilganligini tekshirish funktsiyasi quyidagicha ko'rinadi:
def check_for_existence(filename):
for row in current_rows:
if row.title in filename:
return True
elif filename in row.title:
return True
return False
xulosa
Ushbu maqolani o'qigan barchaga rahmat. Umid qilamanki, bu sizga ko'proq o'qishga yordam beradi :)
Manba: www.habr.com