Kotikirjaston luominen Notionin ja Pythonin avulla

Olen aina ollut kiinnostunut siitä, kuinka sähköisessä kirjastossani on parasta jakaa kirjoja. Lopulta päädyin tähän vaihtoehtoon sivumäärän ja muiden herkkujen automaattisella laskennalla. Pyydän katsaan kaikilta kiinnostuneilta.

Osa 1. Dropbox

Kaikki kirjani ovat dropboxissa. On 4 luokkaa, joihin jaoin kaiken: oppikirja, lähde, kaunokirjallisuus, tietokirjallisuus. Mutta en lisää hakuteoksia taulukkoon.

Suurin osa kirjoista on .epub, loput .pdf. Toisin sanoen lopullisen ratkaisun täytyy jollakin tavalla kattaa molemmat vaihtoehdot.

Polkuni kirjoihin ovat suunnilleen seuraavanlaiset:

/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub 

Jos kirja on fiktiota, luokka (eli "Design" yllä olevassa tapauksessa) poistetaan.

Päätin olla vaivautumatta Dropbox API:n kanssa, koska minulla on heidän sovellus, joka synkronoi kansion. Eli suunnitelma on tämä: otamme kirjat kansiosta, ajamme jokaisen kirjan sanalaskurin läpi ja lisäämme sen käsitteelliseen.

Osa 2. Lisää rivi

Itse pöydän pitäisi näyttää suunnilleen tältä. HUOMIO: on parempi tehdä sarakkeiden nimet latinaksi.

Kotikirjaston luominen Notionin ja Pythonin avulla

Käytämme epävirallista Notion API:ta, koska virallista ei ole vielä toimitettu.

Kotikirjaston luominen Notionin ja Pythonin avulla

Siirry kohtaan Notion, paina Ctrl + Shift + J, siirry kohtaan Sovellus -> Evästeet, kopioi token_v2 ja kutsu sitä TOKENiksi. Sitten siirrymme tarvitsemamme sivulle kirjastotunnuksella ja kopioimme linkin. Kutsumme sitä NÄISTE.

Sitten kirjoitamme koodin yhteyden muodostamiseksi Notioniin.

database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()

Seuraavaksi kirjoitetaan funktio rivin lisäämiseksi taulukkoon.

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

Mitä täällä tapahtuu. Otamme ja lisäämme uuden rivin ensimmäisen rivin taulukkoon. Seuraavaksi jaamme polkumme "/" -merkkiä pitkin ja saamme tunnisteet. Tunnisteet - "taide", "suunnittelu", kirjoittaja ja niin edelleen. Sitten asetamme kaikki tarvittavat levyn kentät.

Osa 3. Sanojen, tuntien ja muiden ilojen laskeminen

Tämä on vaikeampi tehtävä. Kuten muistamme, meillä on kaksi muotoa: epub ja pdf. Jos kaikki on selvää epubissa - sanat ovat luultavasti siellä, niin kaikki ei ole niin selvää pdf: ssä: se voi koostua yksinkertaisesti liimatuista kuvista.

Joten funktiomme sanojen laskemiseksi PDF:ssä näyttää tältä: otamme sivujen määrän ja kerromme tietyllä vakiolla (keskimääräisellä sanojen määrällä sivulla).

Täällä se on:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Tämä WORDS_PER_PAGE A4-sivulle on noin 300.

Nyt kirjoitetaan funktio sivujen laskemiseksi. Me käytämme pyPDF2.

def get_pdf_pages_number(path, filename):
    pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
    return pdf.getNumPages()

Seuraavaksi kirjoitamme artikkelin sivujen laskemisesta Epubissa. Käytämme epub_converter. Tässä otamme kirjan, muunnamme sen riveiksi ja laskemme jokaisen rivin sanat.

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)

Nyt lasketaan aika. Otamme suosikkisanamäärämme ja jaamme sen lukunopeudellasi.

def get_reading_time(words_count):
    return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10

Osa 4. Kaikkien osien liittäminen

Meidän täytyy käydä läpi kaikki mahdolliset polut kirjakansiossamme. Tarkista, onko Notionissa jo kirja: jos on, meidän ei enää tarvitse luoda riviä.
Sitten meidän on määritettävä tiedostotyyppi, laskemalla sanojen määrä tästä riippuen. Lisää kirja loppuun.

Tämä on koodi, jonka saamme:

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 toiminto tarkistaa, onko kirjaa lisätty, näyttää tältä:

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

Johtopäätös

Kiitos kaikille tämän artikkelin lukeneille. Toivottavasti se auttaa sinua lukemaan lisää :)

Lähde: will.com

Lisää kommentti