​ 最近想将从网上爬取的**.txt文本文件放到kindle里阅读,但是现在kindle和苹果一样,支持.epub**格式的文件,以前的mobi等格式的文件已经不流行了。于是想写一个格式转换工具。

​ 为了让**.txt文本文件也能在Kindle或者苹果设备的iBooks阅读器中阅读,并且包含目录等信息,需要将.txt文本文件转换为.epub**格式的文件。下面使用python写了一个转换工具,利用ebooklib库,可以转换包含类似以下形式的文本内容的txt文件:

第1章 标题1
    第1章内容...
    
第二章 标题2
    第二章内容...

1、 安装ebooklib包


电脑上需安装python和pip工具,这个就不说了。

在终端使用pip或者pip3安装能处理epub格式的ebooklib库。

pip install ebooklib

2、 使用和运行python代码进行转换


创建一个python文件,比如convertTxtToEpub.py,内容如下。

修改下面代码中的路径和书籍信息,使其适用于自己的文件。

import re, os, sys
from ebooklib import epub

'''
指定txt文件路径和书籍信息, 将txt文件转换为ePub格式的文件。
生成的文件里包含有目录,设置了初始文字字体大小和段落首行缩进。
'''

# 将以下路径和书籍信息,修改为自己的文件对应的信息
input_file_name = "书名.txt"
output_file_name = "书名.epub"

input_folder_path = "/Users/user/Documents/books/"
output_folder_path = "/Users/user/Documents/books/"

# 设置书籍元数据
book_title = "书名"
book_author = "作者名"

# 设置文本字体大小
font_size = "16px"
# 设置所读取文件的编码格式
encoding = 'utf-8'


def main():
    input_file_path = os.path.join(input_folder_path, input_file_name)
    output_file_path = os.path.join(output_folder_path, output_file_name)
    # 调用函数创建ePub文件
    create_epub(input_file_path, output_file_path)


def create_epub(txt_path, epub_path):
    # 创建ePub书籍对象
    book = epub.EpubBook()

    # 设置元数据
    book.set_title(book_title)
    book.set_language("zh")
    book.add_author(book_author)

    # 打开txt文件并读取内容
    try:
        with open(txt_path, 'r', encoding=encoding) as file:
            try:
                content = file.readlines()
                # 其他文件处理逻辑
            except UnicodeDecodeError as e:
                print(f"解析Unicode错误: {e} at position {e.start}")
                print(f"错误字符: {e.object[e.start:e.end]}")
                print("解决方法:修改编码格式,比如改成'utf-8'或'gbk'")
                sys.exit(1)  # 终止程序执行
    except FileNotFoundError:
        print(f"文件未找到: {txt_path}")
        sys.exit(1)
    except Exception as e:
        print(f"发生错误: {e}")
        sys.exit(1)

    current_chapter = None
    chapter_content = ''

    # 遍历文本行
    for line in content:
        line = line.strip()

        # 使用正则表达式匹配章节标题
        pattern = r'^\s*第\s*[0-9一二三四五六七八九十百千万]+\s*[章回卷]\s+\S+'
        match = re.match(pattern, line)
        if match:
            # 如果已经有当前章节,将其添加到书籍中
            if current_chapter is not None:
                c = epub.EpubHtml(title=current_chapter, file_name=f"{current_chapter}.xhtml", lang='zh')
                c.content = f"<h1>{current_chapter}</h1><style>p {{font-size: 16px;}}</style><p>{chapter_content}</p>"
                book.add_item(c)
                book.toc.append(c)
                book.spine.append(c)  # 将章节添加到spine中,确保章节链接顺序正确

            # 更新当前章节和内容
            current_chapter = line
            chapter_content = ''

            # 跳过处理标题行
            continue

        # 判断当前行是否为空行,如果是空行,则在chapter_content末尾添加一个空的<p>标签
        if not line:
            chapter_content += "<p>&nbsp;</p>"
        else:
            # 添加行内容到当前章节内容并添加首行缩进效果
            chapter_content += f"<p><span style='margin-left: 2em'>{line}</span></p>"

    # 处理最后一个章节
    if current_chapter is not None:
        c = epub.EpubHtml(title=current_chapter, file_name=f"{current_chapter}.xhtml", lang='zh')
        c.content = f"<h1>{current_chapter}</h1><style>p {{font-size: 16px;}}</style><p>{chapter_content}</p>"
        book.add_item(c)
        book.toc.append(c)
        book.spine.append(c)

    # 设置书籍的目录
    book.add_item(epub.EpubNcx())
    book.add_item(epub.EpubNav())

    # 设置目录属性
    book.spine = ['nav'] + book.spine

    # 生成ePub文件
    epub.write_epub(epub_path, book, {})
    print("转换结束。")


if __name__ == '__main__':
    main()

在终端运行python文件:

python convertTxtToEpub.py

或者直接使用合适的编辑器运行即可。

3、 用阅读器打开EPUB文件

将**.epub**格式的文件导入kindle或苹果设备中打开,就可以顺利阅读了。