python读取calibre的opf文件到表格

news2024/12/27 17:03:59

opf文件之一:

在这里插入图片描述

python 将 Calibre Library 里面所有opf文件的title,creator,date,description,language,subject内容写入表格中,其中opf之一如上,表头对应为:标题,作者,日期,描述,语言,标签。

1. 实现步骤

目录遍历 → xml 解析 → 信息提取 → 数据保存

使用 os.walk() 函数遍历指定的根目录及其所有子文件夹,返回每个目录路径、子文件夹的名称和文件名称列表, xml.etree.ElementTree 解析每个文件,通过定义的标签字典,提取标题、作者、日期、描述、语言和标签等字段,并在提取描述字段后的处理过程中使用正则表达式 re.sub() 方法来去除 标签字段 中的尖括号字符串(例如: <div>, <p>, <span style="...">, </p>等 HTML 标签),最后将提取的数据存入一个列表中,转换为 pandas 的 DataFrame,并保存为 .csv 文件。

2. 设置环境

首先,确保已安装所需库 pandaslxml

pip install pandas lxml

3. 代码实现

import os
import xml.etree.ElementTree as ET
import pandas as pd
import re

# 保存每个 OPF 文件的信息
data = [] 

# 定义要提取的信息的标签和对应的 CSV 列
tags = {
    'title': './/{http://purl.org/dc/elements/1.1/}title',
    'creator': './/{http://purl.org/dc/elements/1.1/}creator',
    'date': './/{http://purl.org/dc/elements/1.1/}date',
    'description': './/{http://purl.org/dc/elements/1.1/}description',
    'language': './/{http://purl.org/dc/elements/1.1/}language',
    'subject': './/{http://purl.org/dc/elements/1.1/}subject'
}


# 函数:删除描述中的 HTML 标签
def clean_html(raw_html):
    clean = re.sub(r'<.*?>', '', raw_html)  # 正则表达式去除标签
    return clean


# 指定包含子文件夹的根目录
root_directory = 'E:\Calibre Portable\Calibre Library'  # 替换为 OPF 文件的实际根目录

# 遍历目录中的所有子文件夹和 OPF 文件
for dirpath, _, filenames in os.walk(root_directory):
    for filename in filenames:
        if filename.endswith('.opf'):
            file_path = os.path.join(dirpath, filename)

            # 解析 OPF 文件
            try:
                tree = ET.parse(file_path)
                root = tree.getroot()

                # 提取信息
                extracted_data = {}
                for key, xpath in tags.items():
                    element = root.find(xpath)
                    if element is not None:
                        text = element.text if element.text is not None else ''
                        # 如果是描述字段,清理 HTML 标签
                        if key == 'description':
                            text = clean_html(text)
                        extracted_data[key] = text
                    else:
                        extracted_data[key] = ''

                # 将提取的数据添加到列表中
                data.append(extracted_data)

            except ET.ParseError as e:
                print(f'Error parsing {file_path}: {e}')
            except Exception as e:
                print(f'An error occurred with {file_path}: {e}')

# 创建 DataFrame 和保存到 CSV
df = pd.DataFrame(data)
df.columns = ['标题', '作者', '日期', '描述', '语言', '标签']  # 重命名列
output_file = 'output/output3.csv'  # 输出文件名
df.to_csv(output_file, index=False, encoding='utf-8-sig')

print(f'Data has been written to {output_file}.')

4. 运行效果

在这里插入图片描述


5. calibre 配置问题

a. 重名问题

calibre书title重名但实际不是同一本怎么办,(提前设置了查重)
解决方法:先把已存在的另改一个名字,然后导入,再把名字改回一样的就可以共存了。

b. 自动添加

配置添加书籍,指定目录

在这里插入图片描述

c. 批量修改

在这里插入图片描述
批量设置会更方便,例如:批量修改作者、标签、出版社等等。

d. 书籍合并

在这里插入图片描述同一本书的不同格式同时存在于一个库,可以合并不同格式到第一本书。
如果不存在,导入时报提示,可以在元数据中导入:

在这里插入图片描述

f. 改变布局

在这里插入图片描述

e. 书籍备份

在这里插入图片描述
在这里插入图片描述这里导出书名使用的好像是排序书名。

导出效果:
在这里插入图片描述

g. 网页访问

单击“连接/共享”按钮,然后选择“启动内容服务器”。
然后在电脑中打开浏览器(最好是Chrome或Firefox),输入以下地址:

http://127.0.0.1:8080

这将在浏览器中打开一个页面,显示calibre书库,单击任意图书并浏览其中的书籍。单击一本书,它将显示有关该书的所有元数据,以及菜单按钮“阅读书籍”和“下载书籍”。单击菜单“阅读书籍”按钮开始阅读书籍。

在这里插入图片描述

参考:calibre-ebook中文手册 https://manual.calibre-ebook.com/zh_CN/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

豆包大模型升级:日均Tokens使用量破5000亿,字节跳动打造即刻体验的《Her》式AI

ChatGPT 发布近两年后&#xff0c;全球掀起了一场大模型竞赛&#xff0c;如今怎么将大模型落地&#xff0c;成为萦绕在每一家 AI 公司的最大命题。 最近有媒体统计&#xff0c;自从 GPT-3.5 上线以来&#xff0c;中国新成立的 AI 公司已经有近 8 万家陷入注销、吊销或停业异常…

【前端】vue数据监测原理

问题展示&#xff1a; 点击按钮之后&#xff0c;vue中的persons数据改变&#xff0c;但是页面显示的内容没变。&#xff08;先点击按钮再打开vue的数据面板可以看见改变&#xff0c;先打开后点击数据面板也不能显示改变。&#xff09; 此时的更新代码&#xff1a; methods:{…

AI副业:别只顾刷黑神话悟空!AI做神话账号,商单月入过万(附教程)

前言 国产3A大作《黑神话&#xff1a;悟空》一经发布&#xff0c;瞬间登顶steam榜首&#xff0c;打破单机游戏在线记录&#xff0c;全球几十万国外玩家听着中文配音&#xff0c;看着翻译过来的英文字幕&#xff0c;玩的不亦乐乎&#xff01; 甚至国外论坛上兴起了一股西游风&a…

eBest AI 大模型:智能化引领快消新未来

在快消品行业的高速变化中&#xff0c;数据与知识的管理、分析和应用变得至关重要。面对着日益增长的市场需求和顾客个性化的体验期望&#xff0c;如何利用技术提升效率、增强客户互动和优化销售策略&#xff1f;eBest GPT Hub&#xff0c;一个专为快消行业打造的AI大模型平台&…

第二节:Nodify 添加节点到编辑器中

引言 上节说到Nodify有三层结构&#xff0c;编辑器Editor&#xff0c;节点Node和连接组件Connection&#xff0c;下面就让我们来进行第一步尝试&#xff0c;在编辑器中添加一个节点。 在窗口中添加nodify命名空间&#xff0c;并添加控件。 xmlns:nodify"https://miroiu.…

docker 多线成服务,比如gunicorn服务启动报错解决办法

docker执行的时候报错&#xff0c;排查是线程创建权限不足导致的&#xff0c;报错如下。 解决办法 docker run -e OPENBLAS_NUM_THREADS1 your_image

淘宝商品评论API:评价内容中的关键词搜索与筛选

淘宝商品评论API为开发者提供了强大的工具&#xff0c;用于获取淘宝商品的评论信息&#xff0c;包括评价内容、评论评分、评论时间等。在评价内容中进行关键词搜索与筛选&#xff0c;是电商数据分析、用户行为研究以及商品质量监控等场景下的重要需求。以下是对这一过程的详细解…

EasyCVR视频汇聚平台革新播放体验:WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新&#xff0c;视频监控已经广泛应用于社会各个领域&#xff0c;成为现代安全管理的重要组成部分。在视频监控领域&#xff0c;视频编码技术的选择尤为重要&#xff0c;它不仅关系到视频的质量&#xff0c;还直接影响到视频的传输效率和兼…

智领云开源KDP:深度剖析其与主流数据平台的性能与特性对比

本文由智领云 LeetTools 工具自动生成 申请试用&#xff1a; https://www.leettools.com/feedback/ 在当今快速发展的技术环境中&#xff0c;数据平台的选择对企业的数字化转型和业务发展至关重要。本文将重点分析智领云开源KDP与其他数据平台的比较&#xff0c;探讨其在大数据…

[000-01-022].第03节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建&#xff1a; 1.1.搭建RabbitMQ单体架构&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令(分别按照以下顺序安装…

【多线程基础】Java线程的六种状态

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java多线程 &#x1f4da;本系列文章为个人…

重生奇迹MU 冲锋在前近战职业

刀光剑影&#xff0c;近战搏杀的乐趣是热爱近战职业的玩家享受最强体验。重生奇迹MU中有很多近战职业&#xff0c;每个职业都拥有独特的技能和玩法&#xff0c;在战斗中表现也各不相同。选择近战职业的玩家都是英勇者&#xff0c;敢于冲锋陷阵&#xff0c;迎击敌人&#xff0c;…

【CSP:202303-2】垦田计划(Java)

题目链接 202303-2 垦田计划 题目描述 求解思路 直接模拟&#xff1a;创建一个数组arr[]&#xff0c;a[i]用来记录将第i天缩短所需要的资源数。在读取数据的时候直接对数组进行初始化。maxTime表示资源优化之前需要花费的最大天数。需要注意&#xff1a;在进行优化遍历时&am…

秋招力扣Hot100刷题总结——滑动窗口

1. 无重复字符的最长子串&#xff08;手撕频率非常高&#xff09; 题目要求&#xff1a;给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 代码及思路 使用一个hashmap维护已经出现过的字符遍历字符串&#xff0c;当字符已经存在时&#xff0c;根…

微服务实战系列之玩转Docker(十二)

前言 山一程&#xff0c;水一程&#xff0c;身向榆关那畔行&#xff0c;夜深千帐灯。——清纳兰性德 最近偶读纳兰的《长相思》经典之作&#xff0c;被这个“行军”场面震撼了。长长的队伍&#xff0c;跋山涉水&#xff0c;野宿一处。夜深人静的时候&#xff0c;突然激发了纳兰…

CSS3页面布局-三栏-固定宽度布局

布局的基本概念 多栏布局三种基本实现方案&#xff1a;固定宽度&#xff0c;流动&#xff0c;弹性。 固定宽度布局&#xff1a;大小不会随用户调整浏览器窗口大小。 一版960-1100,960常见&#xff0c;可以被3,4,5,6,8,10,12,16整除。 流动布局&#xff1a;大小会随用户调整…

芯片要火不要“热”!仿真技术助力芯片热设计

芯片散热仿真好比一场微观世界里的“清凉大作战”&#xff01; 想象一下&#xff0c;小小的芯片就像迷你城市&#xff0c;无数的电子如同居民在其中穿梭。当芯片高速运转&#xff0c;就像城市进入了狂欢&#xff0c;热闹非凡但也会产生大量的热量。 而芯片散热仿真用数字和算法…

OpenStack前置配置与安装

环境&#xff1a;CentOS8最小化安装 九大组件&#xff1a; Nova:提供计算资源&#xff0c;cpu、内存等 Glance:提供镜像&#xff08;查找&#xff09;能力&#xff0c;真正存放镜像的是后端Swift。 Swift:对象存储&#xff0c;可以用来存放镜像。还可以用来存储备份。 Cin…

java生成黄红封面

import java.awt.*; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO;public class CoverGenerator {public static void generateCover(String name, String outputPath) {// A4纸的分辨率 (300 …

POJO、PO、DTO、VO、BO到底是什么?都如何使用?(基础概念+传输示意图+示例代码)带你一次玩转层出不穷的Object

文章目录 前言一、解释关系二、POJO、PO、DTO、VO、DAO、BO1.什么是POJO&#xff08;Plain Old Java Object&#xff09;2.什么是PO&#xff08;Persistent Object&#xff09;3.什么是DTO&#xff08;Data Transfer Object&#xff09;4.什么是VO&#xff08;View Object&…