Create and Read ePub Files with Python and ebooklib
ePub is the standard eBook format supported by most readers (Apple Books, Kobo, Adobe) and can be converted to Kindle MOBI. Python lets you create, read and convert ePub files with ebooklib.
Installation
pip install ebooklib beautifulsoup4
Create a Basic ePub
from ebooklib import epub
def create_epub(title, author, chapters, output):
book = epub.EpubBook()
book.set_identifier("id123456")
book.set_title(title)
book.set_language("en")
book.add_author(author)
epub_chapters = []
for i, (ch_title, ch_html) in enumerate(chapters, 1):
ch = epub.EpubHtml(
title=ch_title,
file_name=f"chapter_{i}.xhtml",
lang="en"
)
ch.content = f"<h1>{ch_title}</h1>{ch_html}"
book.add_item(ch)
epub_chapters.append(ch)
book.toc = tuple(epub_chapters)
book.spine = ["nav"] + epub_chapters
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
epub.write_epub(output, book)
print(f"ePub created: {output}")
chapters = [
("Introduction", "<p>Welcome to this digital book.</p><p>This is the first chapter.</p>"),
("Chapter 1", "<p>The main content of chapter one goes here.</p>"),
("Conclusion", "<p>Thank you for reading this book.</p>"),
]
create_epub("My First eBook", "John Smith", chapters, "my_book.epub")
Add Cover and CSS Styles
from ebooklib import epub
book = epub.EpubBook()
book.set_title("Book with Cover")
book.set_language("en")
book.add_author("Jane Doe")
with open("cover.jpg", "rb") as f:
cover_bytes = f.read()
book.set_cover("cover.jpg", cover_bytes)
css = epub.EpubItem(
uid="style",
file_name="style/main.css",
media_type="text/css",
content=b"body { font-family: Georgia, serif; line-height: 1.6; } h1 { color: #333; }"
)
book.add_item(css)
ch = epub.EpubHtml(title="Chapter 1", file_name="ch1.xhtml", lang="en")
ch.content = "<h1>The Beginning</h1><p>Once upon a time...</p>"
ch.add_item(css)
book.add_item(ch)
book.toc = (ch,)
book.spine = ["nav", ch]
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
epub.write_epub("book_with_cover.epub", book)
Read and Extract Text from ePub
from ebooklib import epub
from bs4 import BeautifulSoup
def extract_epub_text(epub_path):
book = epub.read_epub(epub_path)
text = []
for item in book.get_items_of_type(epub.ITEM_DOCUMENT):
soup = BeautifulSoup(item.get_content(), "html.parser")
paras = [p.get_text() for p in soup.find_all(["p", "h1", "h2", "h3"])]
text.extend([t.strip() for t in paras if t.strip()])
result = "\n\n".join(text)
with open("extracted_text.txt", "w", encoding="utf-8") as f:
f.write(result)
print(f"Extracted {len(text)} paragraphs ({len(result)} chars)")
return result
extract_epub_text("novel.epub")
List Metadata and Chapters
from ebooklib import epub
def epub_info(epub_path):
book = epub.read_epub(epub_path)
print(f"Title: {book.get_metadata('DC', 'title')}")
print(f"Author: {book.get_metadata('DC', 'creator')}")
print(f"Language: {book.get_metadata('DC', 'language')}")
docs = list(book.get_items_of_type(epub.ITEM_DOCUMENT))
print(f"\nChapters ({len(docs)}):")
for item in docs:
print(f" {item.file_name} ({len(item.get_content())} bytes)")
epub_info("novel.epub")
Convert TXT to ePub
from ebooklib import epub
import re
def txt_to_epub(txt_path, title, author, output):
with open(txt_path, encoding="utf-8") as f:
content = f.read()
parts = re.split(r'\n(CHAPTER\s+\w+|Chapter\s+\d+)\n', content)
book = epub.EpubBook()
book.set_title(title)
book.set_language("en")
book.add_author(author)
chapters = []
for i, block in enumerate(parts, 1):
if not block.strip(): continue
paras = "".join(f"<p>{p.strip()}</p>" for p in block.split("\n") if p.strip())
ch = epub.EpubHtml(title=f"Part {i}", file_name=f"part_{i}.xhtml", lang="en")
ch.content = f"<h2>Part {i}</h2>{paras}"
book.add_item(ch)
chapters.append(ch)
book.toc = tuple(chapters)
book.spine = ["nav"] + chapters
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
epub.write_epub(output, book)
print(f"ePub generated: {output} ({len(chapters)} chapters)")
txt_to_epub("novel.txt", "My Novel", "Unknown Author", "novel.epub")
Additional Resource
For converting ePub to PDF, MOBI or TXT without any coding, use KaijuConverter — free and no registration required.
Related conversions
Document conversions that follow this topic naturally: