0%

kindle paperwhite 笔记按名分类

Cool Idea

kindle 是我最喜欢的设备之一,入手一年以来,在上面我已经阅读了将近70本书,而又喜欢原版的系统(因为可以接受各种推送。如浏览网页直接 推送到kindle上等),刷了多看又卸载掉。kindle的原书笔记很丑。而且按照标记笔记时间进行排列。要是我同时读的有多本,标记的也有多本呢?那笔记会十分混乱。所以决定写下代码,帮助我进行分类。

之前在CSDN写过C++的,版本称为1.0吧,不过有bug就是中文字符什么的。

现在更新pyhon2.0版。 ## 创作过程

1.分析 kindle 原装笔记格式

  1. 每条笔记都以书名起始,"=========="结束
  2. 书名和内容之间有两行空格

 

1
2
3
4
5
6
7
8
9
10
11
12
行者无疆 (余秋雨)
- 您在位置 #1635-1636的标注 添加于 2014年8月26日星期二 下午11:33:04

看城市潜力,拥挤的市中心不是标志。市中心是一个旋涡,把衰草污浊旋到了外缘。真正的潜力忽闪在小巷的窗台下,近郊的庭园里。
==========
行者无疆 (余秋雨)
- 您在位置 #1642-1643的标注 添加于 2014年8月26日星期二 下午11:33:33

这就像写作,当形容词如女郎盛妆、排比句如情人并肩,那就一定尚未进入文章之道。文章的极致如老街疏桐,桐下旧座,座间闲谈,精致散漫。 城市这篇文章,也是这样。
==========


 

2.具体实现

  1. 每次读取书名,如果书名不存在,将其存入字典(py为dic,c++为map)
  2. 读完书名读两行,因为一行为日期,一行为空行。
  3. 用字典去寻找title对应下标index,将当前的笔记内容存入对应的content

 

3.Fix bugs

  1. 每次读取content应该去除末尾换行符'',否则判断和'=========='是否相等总为False
  2. 第一次读取title的时候,会读取三个字符,这是UTF引入的BOM来表示自身编码。去除即可。
  3. 修复linux下换行符引起的无限循环的问题(2015.4.7 )

 

使用方法

windows下:将 kindle 笔记 My Clippings.txt放于 e盘根目录下,运行代码后,会在e盘生成result.txt

linux下:自行修改路径,看备注直接使用当前路径也可以。

展示结果

the result of kindle note distribution
the result of kindle note distribution

Code

最终代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#kindle note v2.1
#author: hrwhisper
#date: 2015.4.7

MyClippingsPath='e:\\My Clippings.txt' #My Clippings.txt =>linux当前目录
OutPutPath='e:\\result.txt' #result.txt =>linux

title,content,dic=[],[],{'a':0}
with open(MyClippingsPath,'r') as f:
line = f.readline().strip('\xef\xbb\xbf')
while line :
index=dic.get(line,-1)
if index == -1:
index = dic[line]=len(title)
title.append(line)
content.append('')

f.readline() #time
f.readline() #blank line

while True: #content start
line = f.readline().strip()
if line == '==========' : break #content end
content[index]+=line
content[index]+='\n'*3
line = f.readline() #next clipping title

with open(OutPutPath,'w') as f:
for i , titleName in enumerate(title):
f.write(titleName+'\n\n')
f.write(content[dic[titleName]])
f.write('\n\n==========\n\n')

print 'ok'
请我喝杯咖啡吧~