我一直对如何最好地在我的电子图书馆中分发书籍感兴趣。 最后,我选择了这个选项,自动计算页数和其他好处。 我询问猫下所有感兴趣的人。
第 1 部分:Dropbox
我所有的书都在保管箱上。 我将所有内容分为 4 类:教科书、参考书、小说、非小说。 但我不会在桌子上添加参考书。
大多数书籍都是 .epub,其余的都是 .pdf。 也就是说,最终的解决方案必须以某种方式涵盖这两种选择。
我的读书之路是这样的:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
如果这本书是小说,则删除该类别(即上例中的“设计”)。
我决定不再使用 Dropbox API,因为我有他们的应用程序来同步文件夹。 也就是说,计划是这样的:我们从文件夹中取出书籍,通过字数计数器运行每本书,并将其添加到 Notion 中。
第 2 部分:添加一行
桌子本身应该看起来像这样。 注意:最好用拉丁文命名列名。
我们将使用非官方的 Notion API,因为官方尚未发布。
转到 Notion,按 Ctrl + Shift + J,转到应用程序 -> Cookies,复制 token_v2 并将其命名为 TOKEN。 然后我们进入我们需要的带有图书馆标志的页面并复制链接。 我们称之为“NOTION”。
然后我们编写连接Notion的代码。
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
接下来,让我们编写一个函数来向表中添加一行。
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
这里发生了什么。 我们在表的第一行中添加一个新行。 接下来,我们沿着“/”分割路径并获取标签。 标签——“艺术”、“设计”、作者是谁等等。 然后我们设置板的所有必要字段。
第 3 部分:计算字数、时间和其他乐趣
这是一项更加艰巨的任务。 我们记得,我们有两种格式:epub 和 pdf。 如果 epub 的一切都很清楚 - 文字可能就在那里,那么 pdf 的一切就不那么清楚了:它可能只是由粘合图像组成。
因此,我们计算 PDF 字数的函数将如下所示:我们获取页数并乘以某个常数(每页的平均字数)。
这里是:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
A4 页面的 WORDS_PER_PAGE 大约为 300。
现在让我们编写一个函数来计算页数。 我们将使用
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
接下来,我们将编写一个用于计算 Epub 中页数的东西。 我们用
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)
现在我们来计算一下时间。 我们将我们最喜欢的字数除以您的阅读速度。
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
第 4 部分:连接所有部件
我们需要遍历 books 文件夹中所有可能的路径。 检查Notion中是否已经有一本书:如果有,我们就不再需要创建一行。
然后我们需要判断文件类型,根据这个,统计字数。 最后添加一本书。
这是我们得到的代码:
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)
检查是否已添加书籍的函数如下所示:
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
结论
感谢所有阅读这篇文章的人。 我希望它能帮助你阅读更多:)
来源: habr.com