Ich habe mich immer gefragt, wie ich meine Bücher in meiner digitalen Bibliothek besser organisieren kann. Am Ende bin ich zu einer Lösung gekommen, die eine automatische Zählung der Seiten und andere nützliche Funktionen umfasst. Alle Interessierten lade ich ein, weiterzulesen.
Teil 1. Dropbox
Alle Bücher befinden sich in meinem Dropbox. Ich habe sie in 4 Kategorien unterteilt: Lehrbuch, Nachschlagewerk, Belletristik und Sachbuch. Nachschlagewerke füge ich jedoch nicht zur Tabelle hinzu.
Die meisten Bücher sind im .epub-Format, die restlichen im .pdf-Format. Das finale Lösung sollte beide Formate abdecken.
Die Pfade zu den Büchern sind ungefähr wie folgt:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub Wenn ein Buch zur Belletristik gehört, entfällt die Kategorie (also 'Design' im obigen Fall).
Ich wollte mich nicht mit der Dropbox-API herumschlagen, zum Glück habe ich die Anwendung installiert, die den Ordner synchronisiert. Der Plan sieht so aus: Wir nehmen die Bücher aus dem Ordner, laufen jedes Buch durch einen Wortzähler und fügen es zu Notion hinzu.
Teil 2. Zeile hinzufügen
Die Tabelle sollte ungefähr wie folgt aussehen. ACHTUNG: Die Spaltennamen sollten besser in lateinischer Schrift sein.

Wir werden die inoffizielle API von Notion verwenden, da die offizielle noch nicht verfügbar ist.

Öffnen Sie Notion, drücken Sie Ctrl + Shift + J, wechseln Sie zu Application -> Cookies, kopieren Sie token_v2 und nennen Sie es TOKEN. Dann gehen wir zu der gewünschten Seite mit der Bibliothekstabelle und kopieren den Link. Nennen wir es NOTION.
Als Nächstes schreiben wir den Code zur Verbindung mit Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()Jetzt schreiben wir eine Funktion zum Hinzufügen einer Zeile zur Tabelle.
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] == "Künstlerisch":
row.author = tags[2]
elif tags[0] == "Sachbuch":
row.tags = tags[2]
elif tags[0] == "Lehrbücher":
row.tags = tags[2]
if len(tags) >= 4:
row.author = tags[3]
row.hours = hours
row.pages = pages_count
row.words = words_countWas hier passiert: Wir fügen eine neue Zeile an der obersten Stelle der Tabelle hinzu. Dann teilen wir unseren Pfad durch " / " und erhalten die Tags. Tags beziehen sich auf "Künstlerisch", "Design", den Autor usw. Danach setzen wir alle erforderlichen Tabelleneinträge.
Teil 3. Zählen von Wörtern, Stunden und anderen Details
Das ist schon eine etwas schwierigere Aufgabe. Wie wir uns erinnern, gibt es zwei Formate: EPUB und PDF. Während EPUB eindeutig viele Wörter enthält, ist der Fall bei PDF nicht so eindeutig: Es kann einfach aus zusammengesetzten Bildern bestehen.
Die Funktion zur Wortzählung in PDF wird also wie folgt aussehen: Wir nehmen die Anzahl der Seiten und multiplizieren sie mit einer bestimmten Konstante (der durchschnittlichen Anzahl von Wörtern pro Seite).
Hier ist sie:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGEDer Wert von WORDS_PER_PAGE für eine A4-Seite liegt ungefähr bei 300.
Jetzt lassen Sie uns eine Funktion zur Zählung der Seiten schreiben. Wir verwenden .
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()Als Nächstes schreiben wir eine Funktion zur Zählung der Seiten in EPUB. Wir verwenden . Hier nehmen wir das Buch, konvertieren es in Zeilen und zählen für jede Zeile die Wörter.
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)Jetzt machen wir die Zeitmessung. Wir nehmen unsere bevorzugte Anzahl von Wörtern und teilen sie durch Ihre Lesegeschwindigkeit.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10Teil 4. Alle Teile verbinden
Wir müssen alle möglichen Wege in unserem Bücherordner durchgehen. Überprüfen, ob das Buch bereits in Notion vorhanden ist: wenn ja, müssen wir die Zeile nicht mehr erstellen.
Dann müssen wir den Dateityp bestimmen und je nach Typ die Wortanzahl berechnen. Am Ende das Buch hinzufügen.
So sieht unser Code aus:
for root, subdirs, files in os.walk(BOOKS_DIR):
if len(files) > 0 and check_for_exursion(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: {}, Datei: {}".format(local_root, file))
if not check_for_existence(filename):
print("Dir: {}, Datei: {}".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("Seiten: {}, Wörter: {}, Stunden: {}".format(count, words_count, hours))
add_row(local_root, filename, words_count, count, hours)Die Funktion zur Überprüfung, ob das Buch hinzugefügt wurde, sieht so aus:
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 FalseFazit
Vielen Dank an alle, die diesen Artikel gelesen haben. Ich hoffe, er hilft Ihnen, mehr zu lesen 🙂.
Quelle: habr.com
