游戏通关,电影看完,是时候用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 微软 Office 365 个人版

Microsoft 微软 Office 365 个人版

106元起

Microsoft 微软 到手18.2元/月 微软office365家庭版microsoft365增强版15个月

Microsoft 微软 到手18.2元/月 微软office365家庭版microsoft365增强版15个月

289元起

Microsoft 微软 office专业版永久激活码office2019增强版终身版outlook密钥

Microsoft 微软 office专业版永久激活码office2019增强版终身版outlook密钥

249元起

自助挂号应用服务

自助挂号应用服务

15000元起

Microsoft 微软 Office2016小型企业版 MAC专用

Microsoft 微软 Office2016小型企业版 MAC专用

149元起

SANGFOR 深信服科技 存储虚拟化双活软件V6.0

SANGFOR 深信服科技 存储虚拟化双活软件V6.0

29000元起

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

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

暂无报价

猎寻 手机信息采集系统1.0 -ZK5000(手机快速点验/手机检查仪)

猎寻 手机信息采集系统1.0 -ZK5000(手机快速点验/手机检查仪)

38800元起

黑马校对软件v22.0国产化平台服务器版6亿字技术支持私有化部署服务

黑马校对软件v22.0国产化平台服务器版6亿字技术支持私有化部署服务

170000元起

Microsoft 微软 活动6天 office365家庭版microsoft365订阅密钥

Microsoft 微软 活动6天 office365家庭版microsoft365订阅密钥

234元起

京东 金山麒麟WPS办公软件V11

京东 金山麒麟WPS办公软件V11

暂无报价

Microsoft 微软 MAC专用办公软件office2019永久版

Microsoft 微软 MAC专用办公软件office2019永久版

269元起

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

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

6904元起

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

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

3990元起

Microsoft 微软 OfficePLUS 订阅会员

Microsoft 微软 OfficePLUS 订阅会员

9.9元起

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

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

196元起
4评论

  • 精彩
  • 最新
提示信息

取消
确认
评论举报

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

相关文章推荐

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