Visada domėjausi, kaip geriausiai paskirstyti knygas savo elektroninėje bibliotekoje. Galų gale aš priėjau prie šios parinkties automatiniu puslapių skaičiaus ir kitų gėrybių skaičiavimu. Visų besidominčių prašau pagal kat.
1 dalis. Dropbox
Visos mano knygos yra „dropbox“. Yra 4 kategorijos, į kurias aš viską suskirstiau: vadovėlis, žinynas, grožinė literatūra, negrožinė literatūra. Bet žinynų prie lentelės nepridedu.
Dauguma knygų yra .epub, likusios .pdf. Tai yra, galutinis sprendimas turi kažkaip apimti abi galimybes.
Mano keliai į knygas yra maždaug tokie:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Jei knyga yra grožinė literatūra, kategorija (tai yra „Dizainas“ aukščiau nurodytu atveju) pašalinama.
Nusprendžiau nesivarginti su Dropbox API, nes turiu jų programą, kuri sinchronizuoja aplanką. Tai yra, planas yra toks: paimame knygas iš aplanko, kiekvieną knygą paleidžiame per žodžių skaitiklį ir pridedame prie sąvokos.
2 dalis. Pridėkite eilutę
Pati lentelė turėtų atrodyti maždaug taip. DĖMESIO: stulpelių pavadinimus geriau daryti lotyniškai.
Naudosime neoficialią Notion API, nes oficialioji dar nepateikta.
Eikite į „Notion“, paspauskite Ctrl + Shift + J, eikite į „Application -> Cookies“, nukopijuokite token_v2 ir pavadinkite jį TOKEN. Tada einame į mums reikalingą puslapį su bibliotekos ženklu ir nukopijuojame nuorodą. Mes tai vadiname NUOSTATA.
Tada parašome kodą prisijungti prie Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Tada parašykime funkciją, kad pridėtume eilutę į lentelę.
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
Kas čia vyksta. Mes paimame ir pridedame naują eilutę į lentelę pirmoje eilutėje. Tada padalijame kelią išilgai „/“ ir gauname žymas. Žymos – kalbant apie „Menas“, „Dizainas“, kas yra autorius ir pan. Tada nustatome visus reikiamus plokštės laukus.
3 dalis. Žodžių, valandų ir kitų malonumų skaičiavimas
Tai sunkesnė užduotis. Kaip prisimename, turime du formatus: epub ir pdf. Jei su epub viskas aišku – žodžiai tikriausiai yra, tai su pdf ne viskas taip aišku: jį gali tiesiog sudaryti suklijuoti vaizdai.
Taigi mūsų žodžių skaičiavimo funkcija PDF formate atrodys taip: paimame puslapių skaičių ir padauginame iš tam tikros konstantos (vidutinio žodžių skaičiaus puslapyje).
Štai ji:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Šis WORDS_PER_PAGE A4 formato puslapyje yra maždaug 300.
Dabar parašykime funkciją puslapiams skaičiuoti. Mes naudosime
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Tada parašysime puslapių skaičiavimą Epub. Mes naudojame
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)
Dabar paskaičiuokime laiką. Paimame mėgstamų žodžių skaičių ir padalijame iš skaitymo greičio.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
4 dalis. Visų dalių sujungimas
Turime eiti per visus įmanomus mūsų knygų aplanko kelius. Patikrinkite, ar „Notion“ jau yra knyga: jei yra, mums nebereikia kurti eilutės.
Tada turime nustatyti failo tipą, priklausomai nuo to, suskaičiuoti žodžių skaičių. Pabaigoje pridėkite knygą.
Tai yra kodas, kurį gauname:
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)
O funkcija patikrinti, ar knyga buvo pridėta, atrodo taip:
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
išvada
Ačiū visiems, kurie skaitė šį straipsnį. Tikiuosi, kad tai padės jums skaityti daugiau :)
Šaltinis: www.habr.com