游戏通关,电影看完,是时候用Python整理下电子书了

2020-02-06 17:25:19 4点赞 38收藏 4评论

游戏通关,电影看完,是时候用Python整理下电子书了

象小编这样喜欢收集电子书的人应该不在少数吧,存了好几个G的电子书,却从来想不起去看。每次看到新出的书又忍不住下载,下载完就感觉好象已经看完了!


于是电子书越来越多,都不知道是什么书了。其实象epub这种文件本身就包含了书名和作者信息。用任何压缩软件都可以解压打开,会找到一个content.opf文件,里面的dc:title标签里就是书名,dc:creator通常是作者名

<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:calibre="http://calibre.kovidgoyal.net/2009/metadata" xmlns:dc="http://purl.org/dc/elements/1.1/">

...

<dc:creator opf:file-as="桐华" opf:role="aut">桐华</dc:creator>

...

<dc:title>最美的时光</dc:title>

...

</metadata>

当然我们不会傻到每个epub文件都去解压去查信息。用Python不用解压就直接读取epub文件,然后取出信息就好了。


class EpubFile:

title = ""

creator = ""

content = ""


def __init__(self, file):

self.file = file

if zipfile.is_zipfile(file):

book = zipfile.ZipFile(file)

for f in book.filelist:

if '.opf' in f.filename: #有些epub不一定拥有content.opf, 可能叫package.opf

self.extract_meta()

opf文件是一个标准的xml, 我们用lxml加xpath就可以读出需要的信息。因为dc:title 需要namespace, 直接用上面例子里的


xmlns:dc="http://purl.org/dc/elements/1.1/"

方法如下


def extract_meta(self):

if self.content != "":

title = self.content.xpath('//dc:title', namespaces={'dc': "http://purl.org/dc/elements/1.1/"})

creator = self.content.xpath('//dc:creator', namespaces={'dc': "http://purl.org/dc/elements/1.1/"})

if len(title) > 0:

self.title = title[0].text

if len(creator) > 0:

self.creator = creator[0].text

拿到作者名和书名后就可以为所欲为了, 小编的作法是作者名为目录,用书名作文件名。这样的好处是如果有的书是一章一个文件的就可以存在同一目录了。


def rename(self, move_to_author_folder=False, top_folder=None):

if len(self.title) > 0:

print(f"{self.title}-{self.creator}")

try:

new_file = self.title.translate({ord(x): '' for x in '/:*?"<>|'})

folder = os.path.dirname(self.file)


if move_to_author_folder:

new_folder = self.creator.translate({ord(x): '' for x in '/:*?"<>|'})

if top_folder:

new_folder = os.path.join(top_folder, new_folder)

else:

new_folder = os.path.join(folder, new_folder)

if not os.path.exists(new_folder):

os.mkdir(new_folder)

shutil.move(self.file, os.path.join(new_folder, new_file + ".epub"))

else:

shutil.move(self.file, os.path.join(folder, new_file + ".epub"))


except Exception as e:

print(e)

else:

print(f"============== {self.file} do not have metadata ==========")

注意IO操作都是很容易出错的,用try..except是比较安全,而且不会影响后续操作。

书名中可能包含不适合做文件名的非法字符,比如‘/:*?"<>|’, 这个用translate方法可以删除。

top_folder是用来递归的,象三层以上的文件夹,如果再加作者名做目录,嵌套就比较多了,容易出现重复文件,所以都移到顶层目录为好。

递归操作如下,非科班出身的同学注意下,就是函数调用本身, 只不过参数换成下一级目录了


def process_dir(folder, top_folder):

for file in os.listdir(folder):

file_path = os.path.join(folder, file)

if os.path.isdir(file_path):

process_dir(file_path, top_folder)

else:

if file.endswith(".epub"):

print(f"parsing {file}")

book = EpubFile(file_path)

book.rename(move_to_author_folder=True, top_folder=top_folder)

处理完了,文件夹非常清爽,可以安心去看电影书了

参考书目:

Python编程从入门到实践70.2元京东去购买



展开 收起

Microsoft 微软 在线发码 正版多年office365家庭microsoft365 Microsoft365 -

Microsoft 微软 在线发码 正版多年office365家庭microsoft365 Microsoft365 -

289元起

卡巴斯基(kaspersky)网络解决方案中小企业版杀毒软件1服务器10台PC三年升级

卡巴斯基(kaspersky)网络解决方案中小企业版杀毒软件1服务器10台PC三年升级

3990元起

华三(H3C) SecPath F100-BAS AV 防病毒 License,3年

华三(H3C) SecPath F100-BAS AV 防病毒 License,3年

6904元起

华三(H3C) SecPath F100-BAS URL特征库升级服务授权函,3年

华三(H3C) SecPath F100-BAS URL特征库升级服务授权函,3年

2701元起

Microsoft 微软 OfficePLUS 订阅会员

Microsoft 微软 OfficePLUS 订阅会员

暂无报价

微软Office 365 15个月家庭版 职场利器 智能功能 电脑必备1年6人同享

微软Office 365 15个月家庭版 职场利器 智能功能 电脑必备1年6人同享

628元起

微软(Microsoft)365/Office 个人版 文档自动保存 各设备通用 1年盒装 5设备同享

微软(Microsoft)365/Office 个人版 文档自动保存 各设备通用 1年盒装 5设备同享

暂无报价

360企业级终端防病毒系统(涉密计算机平台)单机版

360企业级终端防病毒系统(涉密计算机平台)单机版

暂无报价

微软支持重装绑 office2021永久激活码2019终身版macoffice软件 Office2021小型企业版for Mac

微软支持重装绑 office2021永久激活码2019终身版macoffice软件 Office2021小型企业版for Mac

389元起

Microsoft 微软 Office 365 个人版

Microsoft 微软 Office 365 个人版

106元起

《Nebo》触屏笔记类软件 Windows版

《Nebo》触屏笔记类软件 Windows版

暂无报价

Nintendo 任天堂 Switch游戏卡带《大航海时代4 威力加强版 HD》 中文

Nintendo 任天堂 Switch游戏卡带《大航海时代4 威力加强版 HD》 中文

196元起

任天堂Switch游戏 NS塞尔达传说 荒野之息 旷野之息 中文现货

任天堂Switch游戏 NS塞尔达传说 荒野之息 旷野之息 中文现货

310元起

非接触式AI智能心理监护系统

非接触式AI智能心理监护系统

488000元起

Microsoft 微软 365家庭版个人版正版密钥Office365永久激活2021Mac

Microsoft 微软 365家庭版个人版正版密钥Office365永久激活2021Mac

129元起

自助挂号应用服务

自助挂号应用服务

15000元起

文中相关商品

京东 《图灵程序设计丛书·Python编程:从入门到实践》(第2版)
4评论

  • 精彩
  • 最新
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
38
扫一下,分享更方便,购买更轻松