解决kindle4阅读中文乱码问题——使用python脚本批量把文本转换为utf8编码
昨天买了一台kindle4, 用了一天, 整体感觉还不错, 但是在看中文书籍的时候遇到了下面问题。
阅读中文书籍一段时间后会遇到乱码, 然后再次打开该书籍的时候会有下面的错误提示导致无法打开文件
the selected item could not be opened. If you purchased this item from Amazon, delete this item and redownload it from Archived Items available in Home.
上网查了一下, 原因是 kindle的原生系统对非utf8编码的txt的支持有问题, 而我发现我阅读的大部分中文书籍都是GB2312编码的。
于是我上网搜索了一下, 发现有一些批量转换txt编码的软件, 但是我觉得不太适合自己。 因为我的电子书都是从原来手机上拷贝过来的,目录结构很复杂,我不想把电子书都整理出来再批量转化, 而是希望程序能自己搜索目录下的电子书。于是我就打算自己写一个python脚本来处理这些事情。
总的思路很简单, 输入原文件夹的目录,然后脚本会在把里面的txt文件一一解码,然后再按 utf8 编码。
我是在linux下写这个脚本的,
依赖的额外的 python package 只有 python-chardet, 这个包的作用是检测文本的编码。
安装python-chardet很简单, 一般源里就有。 我用的是 arch linux ,直接用下面的命令就可以。
sudo pacman -S python2-chardet
使用 ubuntu 的童鞋用下面的命令也能安装。
sudo apt-get install python-chardet
脚本的代码如下
#!/usr/bin/env python
#-*- coding:utf8 -*-
import os
import getopt
import chardet
import sys
import re
TXT_FILE_REG = re.compile(r".*\.txt$", flags = re.IGNORECASE) # 用来判断是否是txt文件
def mkdirs_if_not_exists(path):
if not os.path.exists(path): os.makedirs(path)
def convert2utf8(source_path, target_path):
mkdirs_if_not_exists(target_path)
for path, dirs, files in os.walk(source_path):
for fname in files:
if TXT_FILE_REG.match(fname):
file_path = os.path.join(path, fname)
detect_dict = chardet.detect(open(file_path, 'rb').read(4096))
confidence, encoding = detect_dict['confidence'], detect_dict['encoding']
if confidence < 0.9 or encoding == None:
print u"无法准确识别 %s 的编码" % file_path
continue
new_path = os.path.join(target_path, os.path.relpath(file_path, source_path))
mkdirs_if_not_exists(os.path.dirname(new_path))
with open(file_path, "rb") as ifile:
content = ifile.read().decode(encoding, errors = 'ignore')
with open(new_path, "w") as ofile:
ofile.write(content.encode("utf8"))
if __name__ == "__main__":
try:
opts, args = getopt.getopt(sys.argv[1:], "i:o:")
except getopt.GetoptError:
sys.exit(1)
print u"解析参数出错"
opt_dict = dict(opts)
try:
source_path, target_path = opt_dict['-i'], opt_dict['-o']
except KeyError:
print u"必须指定输入输出路径,如: -i /home/orig_txt/ -o /home/utf8_txt/"
sys.exit(2)
convert2utf8(source_path, target_path)
使用方法如下。
#假如你想让 /tmp/txts/ 下的所有 .txt 文件都转化成 utf8编码, 并以原目录结构保存在 /tmp/utf8_txts/ 下。 python convert_encode.py -i /tmp/txts/ -o /tmp/utf8_txts/ # 假如你想直接把转化好的文件直接保存在原目录下, -o 的参数使用原目录即可 python convert_encode.py -i /tmp/txts/ -o /tmp/txts/ # 转化成功后可以用下面的命令检查新文件的编码, 会发现新文件已经都是utf8编码的了。 find /tmp/utf8_txts/ -print0| xargs -0 file
这个脚本在下面的情况不会对文件进行转化
1) 文件不是 .txt 结尾。
2) 对文件的编码判断的把握小于 90%。
搁置一年半的博客
时光荏苒,一晃一年半又过去了。
一年半前因为博客的域名没有续费,之后被别人注册了,也因为个人太懒,所以博客就荒废了一年半。 前段时间偶然在自己的笔记本上发现尘封1年半的wordpress的数据库,就又重新把wordpress搭建起来看看以前写的东西,看着这些以前的blog心头别有一番滋味。
一年半前的自己刚刚接触 web,当时的自己还在web的门前艰辛地探索着。 看看以前的文章就觉得当时的自己虽然还什么都不会,但是那份努力却实实在在的。
现在我买了afeyoung.me 这个域名, 决定重新把这个博客搭建起来,记录自己在人生上的探索历程,让自己的生活更加充实, 同时也总结一些 自己的所得给大家分享, 希望能对大家也有所帮助, 共勉之。
挑战PythonChallenge (2)
第3关
这关其实就是要从源码里找一个两头都是三个大写,中间的字母小写的字符串。結果就是中间的这些小字符串串起来。答案是linkedlist。
其实我觉得不用python也可以,拿出bash grep一下再cut反而更快。 我当时就是直接在vim里用正则表达式就找到了这些字符串。python代码也很简洁,下面是解答。
import re
"".join(re.findall('[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]', text)) #text就是里的内容
这个也够简洁了。
第4关
第4关的URL是http://goo.gl/CZ3E, 点开后就发现这关要做的就是根据他给的数字,每次把nothing后面的值换成他给你的数字就可以了。 但是手动换的话肯定不行。于是我们就有了下面的代码。
prefix = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
findnothing = re.compile(r"nothing is (\d+)").search
nothing = '12345'
while True:
text = urllib.urlopen(prefix + nothing).read()
print text
match = findnothing(text)
if match:
nothing = match.group(1)
print " going to", nothing
else:
break
第5关
第5关的url是http://goo.gl/LrFx,由于我对pickle不熟,这关实在是想不出答案是什么…… 我看到pronouce it 还以为是要发他给的文件转化成音频呢……………… 不过它的提示也太囧了, 说什么 peak hell读起来像pickle.
看了看答案提示后于是就有一下面的代码 。
import pickle
ob = pickle.load(open("banner.p", "r"))
print '\n'.join(''.join(ch*n for ch, n in tu) for tu in ob)
挑战PythonChallenge (1)
这个学期开始学python的时候发现了一个网站,http://www.pythonchallenge.com/。觉得这个很有意思,但是一直没抽时间去做。 从今天开始用闲暇时间来做一做吧。
关于pythonChange:
pythonChallenge是一个用python解迷的网站,迷题的解答是一个字符串,把原来url的最后一个字符串替换成答案就是答案的入口了。
点Click here to get challenged 就可以进入第一关了。
第0关
第一关很明显,就是让你试试规则的 ,进入python ,输入2**38,马上就看到274877906944L,把原来的URL http://www.pythonchallenge.com/pc/def/0.html 改为http://www.pythonchallenge.com/pc/def/274877906944.html就可以进入下一关了。
顺利进入第1关了。
第1关
本子上写着三个字,k->m , o->q , e->g, 正好每个字母都相差2,看到下面这段乱码就想到应该用上面的方法翻译。开始我还是用其实方法写的,后来才想起python的translate。这两天一直在看shell script,想起其实linux下也有一个tr, 用这个命令更简洁。代码如下
st="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
echo $st|tr a-z c-zab
import string trans = string.maketrans(string.ascii_lowercase, string.ascii_lowercase[2:]+string.ascii_lowercase[:2])print st.translate(trans) #这里的st值就是面的st值
下面的乱码得到的就是i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url. 我们把这个对URL使用,于是我们得到了ocr。于是我们进入了http://www.pythonchallenge.com/pc/def/ocr.html
第2关
根据提示直接按ctrl+u,看到那堆乱码,好多好恶心……我们现在要做的就是挑出里面出现次数较少的的字母。
假设我们已经把这些内容存入 st, 解答方法有很多,我挑了一个比较简洁的。
import reprint re.findall(r'[a-zA-Z]', st)import reprint re.findall(r'[a-zA-Z]', st)
惊叹吧, 貌似很复杂的问题用python代码居然这么简洁。得到的几个字母拼起来就是答案。
看宫崎骏电影有感
最近突然心血来潮,居然抽时间把宫崎骏的电影都看了一遍。(这说明我们这届软院的大二下真是闲啊,连考期都可以抽出这么多时间来看电影……)
宫崎骏执导的长篇电影一共有九部:《风之谷》、《天空之城》、《龙猫》、《魔女宅急便》、《红猪》、《幽灵公主》、《千与千寻》、《哈尔的移动城堡》和 《悬崖上的金鱼公主》。 其它还有一些由吉卜力工作室制作的动画借用了宫崎骏的名,但最后证明不是由宫崎骏导演的。
有人说"宫崎峻一生只拍了一部电影,名字叫做我们的纯真与失落。"我非常赞同这句话,宫崎骏的每一部作品都不乏对纯真的描写,《龙猫》就是这方面的代表作。但是在纯真的背后,却总是隐藏着一些深刻而现实的问题,当纯真面临现实的挑战时,就是我们心里最纠结的时刻。他总是能勾起我们童年的回忆,主角的天真总是能让我很怀旧地微笑。宫崎骏不用靠炫丽的场面来吸引眼球,因为那显得太浮燥;他也不用过度煽情的情节来摧泪,因为那显得太矫情。他的作品总是以那种平淡的纯真打动我们,让我们找回心里的那份童真,而他的作品又不乏深刻的主题。
宫崎骏的电影总是给人一种很贴近自然的感觉。电影中森林常常扮演着生命之源的角色,森林在宫崎骏的手法下表现得圣洁可爱。有人说宫崎骏是环保大使。虽然宫崎骏的电影总是反对人类破坏森林,但是用“环保”这个词实在是太生硬了。我更喜欢把它理解为回归大自然,融入大自然。我很喜欢看宫崎骏里的主人公赤脚奔跑的样子,脱去了鞋子后,人的身体直接与草地接触让人感受到灵魂与大自然的融合。回归到大自然的那种天真浪漫使我们又找回了童年时的那份纯真。
以小孩子为题材的电影总是不乏对成长的討論,无论是千寻的幻境奇遇还是魔女奇奇的修练历程,主人公在经历过各种磨砺后总是会成长的。《魔女宅急便》就是这方面的代表作(“宅急便”是速递的意思,直接把日文里的文字搬过来当翻译真囧……)。看完这部作品后觉得有些地方有点奇怪,比如奇奇为什么会突然失去魔法,为什么她恢复魔法后却不能再听懂黑猫绩绩说话了?或许突然的失去魔法只是代表生命中的一些坎坷而已;又或许每一个女孩天生都是一个天使,但是当她们坠入凡尘,有了自己喜欢的人,学会了一点任性后,她们就成为了一个平凡的女孩,所以失去了魔法。失去与黑猫绩绩之间的语言或许就是代表着成长的代价。人总是要长大的,总是要进入社会面对现实的,小时亲密无间的朋友终究有一天会与你分道扬镳,大家会告别童年,然后有了自己的新生活。这就是成长的代价,当你拥有新的东西同时也会放弃一些东西。我们也一样,总会有一天要面对现实,童年的快乐终会成为脑子里永恒的回忆。
和其它的电影一样,宫崎骏的电影里一样有爱情,但因为他的电影有更深层次的内容,爱情在那些主题面前就显得有点渺小了。宫崎骏电影里相爱的两个人常常不会指明最后在一起,宫崎骏总是留给我们更多的遐想。当我看到《幽灵公主》的阿席达卡最后与小桑告别,当我看到千寻离开白龙,虽然他们或许会在某一天重逢,但是这总是让我有种很遗憾的感觉。有时候我就想爱情怎么不能就只是简简单单地相互喜欢,然后就在一起呢?现实中总是会有阻挠,或许是因为ta在千里之外,又或许是因为善变的人心,一切总是不可能都像童话里的那么完美。宫崎骏08年拍爱情为主题的电影——《悬崖上的金鱼公主》,主角只是两个4,5岁的孩子。或许他们不懂爱情,但这就是最纯真的爱情。我很喜欢看着小公主不顾一切,从海底踏浪而来的场景。当时她的心里就只有一人的名字,只有一个目标,那就是宗介。完全不考虑后果,对未知的未来无所畏惧,那一刻,仿佛宗介就是她的整个世界。还有比这个更纯真的爱情吗?我们不知道他们长大后会怎么样,或许这又是一个金鱼公主化为泡沫的悲剧,但是这已经够了,宫崎骏已经带我们体会过一回纯真的爱情了。或许再次回现实时我们将面对的是更多的失落。


