好久没有读书了,突然想读一读历史来提高一下自己的逼格。然后就到网上下载了《史记》原文全文。
![](https://i-blog.csdnimg.cn/blog_migrate/b94a48852a066082482a522aabd9f62d.png)
因为不知道是不是全集的,所以突发奇想,想统计一下总的文字数量,看看是不是基本齐全。OK ,说干就干,能使用的语言很多,C# ,PHP ,JAVA ,C++ ,PYTHON, VB , 都可以。用哪一种呢?python 刚接触,挺新鲜,就你了。没想到,一下子就掉坑里了(如果上天再给我一次选择的机会,我一定选择Java,没想到python 2.7 处理中文真费劲)。
决定用python 了,先选个版本吧,电脑上装了3.5 和 2.7 ,用哪一个呢? 实话说,3.5 就用了一次,爬虫需要。平时用的多的还是2.7 ,经常拿来做一些小的科学计算。那就用 2.7 吧(就这么一步步掉坑里了)。
OK ,开始写代码,第一步就跪了。。。:
![](https://i-blog.csdnimg.cn/blog_migrate/1e7ddb2081c5d0b0b58a64a32fca1b35.png)
沃日,这是什么情况,想看看文件列表都不行。赶紧问度娘,明白了,原来是路径不能出现中文,出现中文的话需要unicode 一下。 我忍了,毕竟写web 的时候,处理下载中文名文件时候也遇到过。于是改吧:
![](https://i-blog.csdnimg.cn/blog_migrate/793b72cc931121536386b7d6484df96a.png)
OK ,没问题了,没有报错,我们就是加了一句 unicode(originpath,"utf-8"). 能罗列出来文件,接下来我们就是挨个的遍历每一个文件了:
![](https://i-blog.csdnimg.cn/blog_migrate/1f3a860e14551f0c57ae6747c8b3cfe3.png)
看上去没问题,能够全部读出来了。然后我们需要判断是符号还是汉字啊,问度娘,知道了unicode 的话,判断是否为汉字可以通过下面方式:
#判断是否为汉字
def is_chinese(uchar):
if uchar >= u'\u4E00'and uchar <= u'\u9FA5':
returnTrue
else:
returnFalse
如上,判断是否为汉字的函数。我们加到程序里面,同时为了统计字数,还需要一个全局变量,python 里面的全局变量有些奇怪,不能初始化。所以,代码进一步完善如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f338f935e33ec2b56a7355c045c298a3.png)
如上,测试了一下,发现竟然乱码了,想想错在哪里呢?f 是直接从文件读取出来的字符串,还是中文的,肯定需要Unicode才能处理啊,赶紧改代码:
![](https://i-blog.csdnimg.cn/blog_migrate/3bb549b40952b2b226489ae8ab2f54df.png)
我的个神,这次没有报错,但是竟然没有把汉字打印出来,我打印了一个字符才break的啊,怎么回事儿?我改成打印五个字符试试:
![](https://i-blog.csdnimg.cn/blog_migrate/b3f1c5f312f0786f7de86cdfc8c29fa7.png)
能打印出来,好奇怪,这说明第一个字符不是中文?赶紧看看文件:
![](https://i-blog.csdnimg.cn/blog_migrate/7d825d394fafd7d6738ed430853fc52c.png)
是汉字啊?那是什么原因?难道是可恶的BOM 头 ?
![](https://i-blog.csdnimg.cn/blog_migrate/946e05a41ee0a34b5b47c4150626058a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/307ff4894c030971fb86f1b040e6b0c2.png)
原来如此啊,果然是BOM 头搞的鬼。
赶紧加代码去除BOM 头:
#去除BOM 头信息
def cut_bom(f):
if f[:3]== codecs.BOM_UTF8:
f = f[3:]
return f
![](https://i-blog.csdnimg.cn/blog_migrate/029d4a043abd66de97c0d0c1e8c18519.png)
如上所示,有东西了,我们已经去掉BOM 头信息了。搞定这些了,只差最后一步的统计了:
![](https://i-blog.csdnimg.cn/blog_migrate/39bc500e7cab8965eb4c2ada757e330b.png)
完美,最后统计出来汉字个数一共有 51 万多。 百度了一下史记字数描述如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c343706a4714f14e3e54cfc78994eb4a.png)
查了一万多字呢。基本上差不多。毕竟史记是经过删改,后人也往里面加了好多东西的。这五十万字就够我看了的。
统计汉字数量并不难,如果用Java 估计十分钟就写出来了,用 python 主要把时间浪费在了乱码处理上,现在基本上就明白了这里面的原理。还是认真读读
在Python中正确使用Unicode, 才有了更加深刻的认识。