Mind on alati huvitanud, kuidas kõige paremini oma elektroonilises raamatukogus raamatuid levitada. Lõpuks jõudsin selle võimaluseni lehtede arvu ja muu hea automaatse arvutamisega. Küsin kõigilt huvilistelt kat.
1. osa. Dropbox
Kõik mu raamatud on dropboxis. Seal on 4 kategooriat, millesse ma kõik jaotasin: õpik, teatmik, ilukirjandus, mitteilukirjandus. Kuid ma ei lisa tabelisse teatmeteoseid.
Enamik raamatuid on .epub, ülejäänud on .pdf. See tähendab, et lõpplahendus peab kuidagi katma mõlemad variandid.
Minu teed raamatuteni on umbes sellised:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Kui raamat on ilukirjandus, siis kategooria (st ülaltoodud juhul „Disain”) eemaldatakse.
Otsustasin Dropbox API-ga mitte vaeva näha, kuna mul on nende rakendus, mis kausta sünkroonib. See tähendab, et plaan on järgmine: võtame kaustast raamatud, laseme iga raamatu läbi sõnade loenduri ja lisame selle mõistesse.
Osa 2. Lisa rida
Tabel ise peaks välja nägema umbes selline. TÄHELEPANU: veergude nimed on parem teha ladina keeles.
Kasutame mitteametlikku Notion API-t, kuna ametlikku pole veel tarnitud.
Avage Notion, vajutage klahvikombinatsiooni Ctrl + Shift + J, avage rakendus -> Küpsised, kopeerige token_v2 ja nimetage see TOKEN. Seejärel läheme raamatukogu märgiga vajalikule lehele ja kopeerime lingi. Me nimetame seda MÕISTEKS.
Seejärel kirjutame Notioniga ühenduse loomiseks koodi.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Järgmisena kirjutame tabelisse rea lisamiseks funktsiooni.
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
Mis siin toimub. Võtame ja lisame esimese rea tabelisse uue rea. Järgmisena jagame oma tee mööda "/" ja saame sildid. Sildid - "Kunst", "Disain", kes on autor ja nii edasi. Seejärel määrame plaadi kõik vajalikud väljad.
3. osa. Sõnade, tundide ja muude naudingute lugemine
See on keerulisem ülesanne. Nagu mäletame, on meil kaks vormingut: epub ja pdf. Kui epubiga on kõik selge - sõnad on tõenäoliselt seal, siis pdf-i puhul pole kõik nii selge: see võib koosneda lihtsalt liimitud piltidest.
Seega näeb meie funktsioon sõnade lugemiseks PDF-is välja järgmine: võtame lehekülgede arvu ja korrutame kindla konstandiga (keskmine sõnade arv lehel).
Siin ta on:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
See WORDS_PER_PAGE A4-lehel on ligikaudu 300.
Nüüd kirjutame funktsiooni lehtede loendamiseks. Me kasutame
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Järgmisena kirjutame Epubis lehekülgede lugemise. Me kasutame
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)
Nüüd arvutame aega. Võtame oma lemmiksõnade arvu ja jagame selle teie lugemiskiirusega.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Osa 4. Kõikide osade ühendamine
Peame oma raamatute kaustas läbima kõik võimalikud teed. Kontrollige, kas Notionis on juba raamat: kui see on olemas, ei pea me enam rida looma.
Seejärel peame määrama failitüübi, sõltuvalt sellest loendama sõnade arvu. Lisage lõppu raamat.
Selle koodi saame:
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)
Ja funktsioon kontrollimaks, kas raamat on lisatud, näeb välja järgmine:
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
Järeldus
Aitäh kõigile, kes seda artiklit lugesid. Loodan, et see aitab teil rohkem lugeda :)
Allikas: www.habr.com