整体思路

  • 目标:将Kindle中的每本书的笔记标注单独提取出保存为一个Markdown文件

其中检测KIndle是否已经正常插入的判断方法:

  • 思路1:读取媒介挂载记录
  • 思路2:直接判断挂载地址是否存在

实现的时候用的第二个思路,Kindle的挂载路径为/media/当前用户名/Kindle,只需判断这个地址是否存在且能进入正常进行读取操作即可

其中对于信息提取,My Clippings.txt中内容格式如下

  1. 书名 作者
  2. 标注/笔记所在位置 时间
  3. 空行
  4. 笔记/标注内容
  5. ==========

每一条笔记都由十个=号进行分割。这样就很容易将内容分开了。

代码实现

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. import os
  4. import getpass
  5. class KindleExtract():
  6. def __init__(self):
  7. pass
  8. def kindle_check(self):
  9. """检测Kindle的Clippings文件"""
  10. username = getpass.getuser()
  11. kindle_path = ""
  12. try:
  13. if 'Kindle' in os.listdir("/media/"+username):
  14. kindle_path = "/media/"+username+"/Kindle"
  15. print u"检测到您的Kindle"
  16. else:
  17. print u"未检测到您的Kindle设备,请确认插入正确再运行本脚本"
  18. exit(1)
  19. if "My Clippings.txt" in os.listdir(kindle_path+"/documents"):
  20. kindle_path = kindle_path+"/documents/My Clippings.txt"
  21. print u"检测到标注信息所在文件"
  22. else:
  23. print u"未检测到标注信息文件"
  24. exit(2)
  25. except Exception, e:
  26. print e
  27. return kindle_path
  28. def get_data(self,kindle_path=None):
  29. result ={}
  30. book=[]
  31. item=[]
  32. with open(kindle_path) as f:
  33. for i,cont in enumerate(f.readlines()):
  34. cont = cont.strip()
  35. if "==========" == cont:
  36. book.append(item)
  37. item = []
  38. continue
  39. # if cont != "":
  40. item.append(cont)
  41. caption = []
  42. for i in book:
  43. caption.append(i[0])
  44. caption = set(caption)
  45. tmp ={}
  46. for i in caption:
  47. tmp[i] = []
  48. for i in book:
  49. tmp[i[0]].append(i[3])
  50. for i in tmp:
  51. c = str(i).split(" ")
  52. title = c[0]
  53. print title
  54. author = " ".join(c[1:])
  55. with open(i.replace("/","·")+".md","w") as out_file:
  56. out_file.write("# 书名:《《"+title+"》》\n")
  57. out_file.write("> 作者:《《"+author+"\n")
  58. for id,item in enumerate(tmp[i]):
  59. out_file.write("+ %s%s\n"%(id,item))
  60. if __name__ == "__main__":
  61. ke = KindleExtract()
  62. ke.get_data(kindle_path="clip.txt")

诸多不完善

提取KIndle中每本书的笔记并单独保存的更多相关文章

  1. python笔记之提取网页中的超链接

    python笔记之提取网页中的超链接 对于提取网页中的超链接,先把网页内容读取出来,然后用beautifulsoup来解析是比较方便的.但是我发现一个问题,如果直接提取a标签的href,就会包含jav ...

  2. python学习笔记——爬虫中提取网页中的信息

    1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...

  3. NodeJS写个爬虫,把文章放到kindle中阅读

    这两天看了好几篇不错的文章,有的时候想把好的文章 down 下来放到 kindle 上看,便写了个爬虫脚本,因为最近都在搞 node,所以就很自然的选择 node 来爬咯- 本文地址:http://w ...

  4. 【前端】提取URL中的各个GET参数

    /**************************** * 有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xx ...

  5. C++ 提取字符串中的数字

    C++ 提取字符串中的数字 #include <iostream> using namespace std; int main() { ] = "1ab2cd3ef45g&quo ...

  6. 在线提取PDF中图片和文字

    无需下载软件,你就可以在线提取PDF中图片和文字,http://www.extractpdf.com/不仅可以获取本地PDF文档的图片和文字,还能获取远程PDF文档的图片和文字.如下图所示:结果本人测 ...

  7. 使用Perl提取Excel中的IO_MUX

    使用Perl提取Excel中的IO_MUX 关键问题 提取数据 格式化输出 循环嵌套 数据结构构建 坐标映射,逆向提取关键字 描述 在IC集成中,我们使用Excel表格规划设计的IC引脚功能映射需要转 ...

  8. java正则表达式提取地址中的ip和端口号

    由于我需要用到java正则表达式提取地址中的ip和端口号,所以我就写了一个demo,测试一下,下面是demo public class Test0810_1 { public static void ...

  9. 提取DirectShow中视频采集的数据

    DirectShow中,数据流(Data Flow)都是依次流过各个Filter的.它对数据的管理也有自己的方法,而且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频采集在的每帧为位图 ...

随机推荐

  1. 用nifi executescript 生成3小时间隔字符串

    import java.io from datetime import datetime from org.apache.commons.io import IOUtils from java.nio ...

  2. hadoop研究:mapreduce研究前的准备工作

    继续研究hadoop,有童鞋问我,为啥不接着写hive的文章了,原因主要是时间不够,我对hive的研究基本结束,现在主要是hdfs和mapreduce,能写文章的时间也不多,只有周末才有时间写文章,所 ...

  3. Yii CModel中rules验证规则[转]

    array( array(‘username’, ‘required’), array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12), array( ...

  4. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  5. Java基础之String、StringBuffer、StringBuilder

    1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串. 生活中很多数据的描述都采用的是字符串的.而且我们还会对其进行操作. 所以,java就提供了这样的一个类供我们使用. (2) ...

  6. MVVM架构~knockoutjs系列之验证信息自定义输出~续

    返回目录 上一讲中,我以一个实际中的例子说明了knockoutjs的自定义验证功能,在使用过程中,出现了一个问题,当然了不是问题,只是一种需求,上一讲中自定义验证的表现是:当页面加载后,自动显示有问题 ...

  7. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  8. 一直都在说反射很有用 谈谈大型.NET ERP系统有哪些地方用到了反射

    反射Reflection,MFC时代叫RTTI(Runtime Type Identification) 运行时类型识别,提供一种动态创建对象的能力. 这里不谈反射的概念和基本用法,仅仅就我遇到的ER ...

  9. 说说null和undefined的那些事

    网上有很多关于null和undefined的解释,那么今天我们也来简单的聊聊null与undefined的话题,以便解开它们的神秘面纱,当然这这是简单的介绍,在日后会有相应的更新. 为什么用==的时候 ...

  10. 在Windows平台上安装Node.js及NPM模块管理

    1. 下载Node.js官方Windows版程序:http://nodejs.org/#download    从0.6.1开始,Node.js在Windows平台上提供了两种安装方式,一是.MSI安 ...