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

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

...

桐华

...

最美的时光

...

当然我们不会傻到每个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的书_游戏通关,电影看完,是时候用Python整理下电子书了相关推荐

  1. 神雕侠侣2显示不了服务器,神雕侠侣2游戏进不去怎么办_游戏进不去解决方法推荐...

    神雕侠侣2游戏进不去怎么办_游戏进不去解决方法推荐 时间:2020-08-05 12:04:35 责任编辑:花降 大小:1164.43MB 语言:中文 平台:安卓 <神雕侠侣2>手游7月2 ...

  2. python去除中间空格只留一个_汇总初学Python的21个操作难点,看完别再去踩坑了...

    初学Python时,不管是容易的操作难点,还是困难的操作难点,都是要一步步的去踩坑摸索得出结果,小编今天就给大家汇总初学时Python的21个操作难点,看完之后可别再去掉到同样的坑里去了. 1 查找当 ...

  3. python计算图解_图解NumPy,看这一篇就够了!

    晓查 编译整理 量子位 报道 | 公众号 QbitAI NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具.然而对初学者来说,NumPy的大量运算方法非常难记. 最近,国 ...

  4. python语法基础学习-Python基础语法精心总结!看完都知道的可以往下继续学习了...

    原标题:Python基础语法精心总结!看完都知道的可以往下继续学习了 这应该是最详细的Python入门基础语法总结! 定义变量,使用变量 1. input 用户自己输入值 2. print 打印值 可 ...

  5. 适合小学生python的书_小学生开始学Python,最接近AI的编程语言:安利一波Python书单...

    原标题:小学生开始学Python,最接近AI的编程语言:安利一波Python书单 AlphaGo 都在使用的 Python 语言,是最接近 AI 的编程语言. 教育部考试中心近日发布了"关于 ...

  6. 怎么用python做战斗机_少儿编程分享:手把手教你用Python编写战斗机游戏(四)

    游戏分享:手把手教你用Python编写 战斗机游戏(四) 2018.1.25 飞机大战就到这里啦 你的飞机大战做出来了吗 加入图像 现在我们已经能够玩游戏了,但这个游戏丑确实有点丑.接下来,我们要把单 ...

  7. 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

  8. 安卓游戏开发用什么引擎_游戏开发学习第一天————用什么软件

    今天开始了虚幻学习的第一天! 好的,那我们就开始学习做游戏吧! 始学习做游戏吧 学习做游戏吧 习做游戏吧 做游戏吧 游戏吧 戏吧 吧 等等,要学做游戏啊...... 第一步要做什么,我还完全不知道啊喂 ...

  9. python动物书_图灵出品的人气O'Reilly动物书,你更钟意哪本?

    今天七夕,咱们图灵教育的微信又赠书了,两拨哦~ 送<计算机程序设计的艺术>(TAOCP)(含卷1和卷2,中英文版任选)了,活动截止到10号零点,点击链接赶紧去微信留言吧. 送挑3个人送书单 ...

最新文章

  1. feign调用如何传递token_走进Spring Cloud之五 eureka Feign(服务调用者)
  2. 由浅入深解读Redis高级能力及性能调优
  3. Android自定义View探索—生命周期
  4. 构建知识图谱,让自己更值钱
  5. 基于SignalR实现B/S系统对windows服务运行状态的监测
  6. 光纤收发器的优势介绍
  7. ~~Trie树(数据结构)(附题目:AcWing 835. Trie字符串统计)
  8. 特殊Office Communicator 2007 R2 Outlook集成错误
  9. java null转string_java null强转string
  10. h5页面如何预览excel文件_在网页中预览word和excel
  11. 机器学习数学基础二:泰勒公式与拉格朗日
  12. 项目投资价值分析-净现值法(NPV)、内部回报率法(IRR)与等额年金法
  13. 新技能get!用 Python 高效背单词!
  14. Navicat Premium的下载及安装
  15. jsp对象的四大作用域的简单介绍
  16. 用html代码制作一个表情图片,canvas绘制一个常用的emoji表情
  17. php1蛋白质带电情况,结合蛋白质(1)
  18. 存储圈装逼必上TOP 10网站
  19. 复选框 el-checkbox选不上
  20. 华为荣耀10作为安卓手机程序开发真机

热门文章

  1. 学习笔记:MySQL高阶知识体系(下)——索引、锁、日志、隔离级别与MVCC
  2. 一个C#函数学完C#图形图像编程基础
  3. round函数怎么用oracle,oracle round函数的使用方法
  4. ens33没有ip地址,linux重启虚拟机网络服务出现异常
  5. java nltk,使用NLTK将Tokenizer组合成语法和解析器
  6. VR全景+汽车,打造汽车销售新模式
  7. 2019年LOL服务器维护,英雄联盟10月24日更新维护几点结束 2019LOL9.21版本更新维护开服时间...
  8. Python 脚本如何设置试用期
  9. 游戏的分类(光盘版和硬盘版)
  10. ajax 调用java类_在ajax中调用java方法