Jeg har altid været interesseret i, hvordan jeg bedst distribuerer bøger i mit elektroniske bibliotek. Til sidst kom jeg til denne mulighed med automatisk udregning af antal sider og andet godt. Jeg spørger alle interesserede under kat.
Del 1. Dropbox
Alle mine bøger er på dropbox. Der er 4 kategorier, som jeg har opdelt alt i: Lærebog, Reference, Skønlitteratur, Faglitteratur. Men jeg tilføjer ikke opslagsbøger til bordet.
De fleste af bøgerne er .epub, resten er .pdf. Det vil sige, at den endelige løsning på en eller anden måde skal dække begge muligheder.
Mine veje til bøger er sådan her:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Hvis bogen er fiktion, fjernes kategorien (det vil sige "Design" i ovenstående tilfælde).
Jeg besluttede ikke at genere Dropbox API, da jeg har deres applikation, der synkroniserer mappen. Det vil sige, planen er denne: Vi tager bøger fra mappen, kører hver bog gennem en ordtæller og tilføjer den til Notion.
Del 2. Tilføj en linje
Selve bordet skal se sådan ud. OBS: det er bedre at lave kolonnenavne på latin.
Vi vil bruge den uofficielle Notion API, fordi den officielle endnu ikke er leveret.
Gå til Notion, tryk på Ctrl + Shift + J, gå til Application -> Cookies, kopier token_v2 og kald det TOKEN. Så går vi til den side vi skal bruge med biblioteksskiltet og kopierer linket. Vi kalder det NOTION.
Derefter skriver vi koden for at oprette forbindelse til Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Lad os derefter skrive en funktion for at tilføje en række til tabellen.
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
Hvad sker der her. Vi tager og tilføjer en ny række til tabellen i første række. Dernæst deler vi vores vej langs "/" og får tags. Tags - i form af "Kunst", "Design", hvem der er forfatter, og så videre. Derefter sætter vi alle de nødvendige felter af pladen.
Del 3. At tælle ord, timer og andre lækkerier
Dette er en sværere opgave. Som vi husker, har vi to formater: epub og pdf. Hvis alt er klart med epub - ordene er der nok, så er alt ikke så klart om pdf'en: den kan simpelthen bestå af limede billeder.
Så vores funktion til at tælle ord i PDF vil se således ud: vi tager antallet af sider og multiplicerer med en bestemt konstant (det gennemsnitlige antal ord pr. side).
Her er hun:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Denne WORDS_PER_PAGE for en A4-side er cirka 300.
Lad os nu skrive en funktion til at tælle sider. Vi vil bruge
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Dernæst vil vi skrive en ting om at tælle sider i Epub. Vi bruger
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)
Lad os nu beregne tiden. Vi tager vores yndlingsordtælling og dividerer det med din læsehastighed.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Del 4. Tilslutning af alle dele
Vi skal gennemgå alle mulige veje i vores bogmappe. Tjek, om der allerede er en bog i Notion: hvis der er, behøver vi ikke længere at oprette en linje.
Så skal vi bestemme filtypen, afhængigt af dette, tælle antallet af ord. Tilføj en bog til sidst.
Dette er koden vi får:
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)
Og funktionen til at kontrollere, om en bog er tilføjet, ser sådan ud:
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
Konklusion
Tak til alle, der læste denne artikel. Jeg håber det hjælper dig med at læse mere :)
Kilde: www.habr.com