好久沒有讀書了,突然想讀一讀歷史來提高一下自己的逼格。然后就到網上下載了《史記》原文全文。

因為不知道是不是全集的,所以突發奇想,想統計一下總的文字數量,看看是不是基本齊全。OK ,說干就干,能使用的語言很多,C# ,PHP ,JAVA ,C++ ,PYTHON, VB , 都可以。用哪一種呢?python 剛接觸,挺新鮮,就你了。沒想到,一下子就掉坑里了(如果上天再給我一次選擇的機會,我一定選擇Java,沒想到python 2.7 處理中文真費勁)。
決定用python 了,先選個版本吧,電腦上裝了3.5 和 2.7 ,用哪一個呢? 實話說,3.5 就用了一次,爬蟲需要。平時用的多的還是2.7 ,經常拿來做一些小的科學計算。那就用 2.7 吧(就這么一步步掉坑里了)。
OK ,開始寫代碼,第一步就跪了。。。:

沃日,這是什么情況,想看看文件列表都不行。趕緊問度娘,明白了,原來是路徑不能出現中文,出現中文的話需要unicode 一下。 我忍了,畢竟寫web 的時候,處理下載中文名文件時候也遇到過。於是改吧:

OK ,沒問題了,沒有報錯,我們就是加了一句 unicode(originpath,"utf-8"). 能羅列出來文件,接下來我們就是挨個的遍歷每一個文件了:

看上去沒問題,能夠全部讀出來了。然后我們需要判斷是符號還是漢字啊,問度娘,知道了unicode 的話,判斷是否為漢字可以通過下面方式:
#判斷是否為漢字
def is_chinese(uchar):
if uchar >= u'\u4E00'and uchar <= u'\u9FA5':
returnTrue
else:
returnFalse
如上,判斷是否為漢字的函數。我們加到程序里面,同時為了統計字數,還需要一個全局變量,python 里面的全局變量有些奇怪,不能初始化。所以,代碼進一步完善如下:

如上,測試了一下,發現竟然亂碼了,想想錯在哪里呢?f 是直接從文件讀取出來的字符串,還是中文的,肯定需要Unicode才能處理啊,趕緊改代碼:

我的個神,這次沒有報錯,但是竟然沒有把漢字打印出來,我打印了一個字符才break的啊,怎么回事兒?我改成打印五個字符試試:

能打印出來,好奇怪,這說明第一個字符不是中文?趕緊看看文件:

是漢字啊?那是什么原因?難道是可惡的BOM 頭 ?


原來如此啊,果然是BOM 頭搞的鬼。
趕緊加代碼去除BOM 頭:
#去除BOM 頭信息
def cut_bom(f):
if f[:3]== codecs.BOM_UTF8:
f = f[3:]
return f

如上所示,有東西了,我們已經去掉BOM 頭信息了。搞定這些了,只差最后一步的統計了:

完美,最后統計出來漢字個數一共有 51 萬多。 百度了一下史記字數描述如下:

查了一萬多字呢。基本上差不多。畢竟史記是經過刪改,后人也往里面加了好多東西的。這五十萬字就夠我看了的。
統計漢字數量並不難,如果用Java 估計十分鍾就寫出來了,用 python 主要把時間浪費在了亂碼處理上,現在基本上就明白了這里面的原理。還是認真讀讀
在Python中正確使用Unicode, 才有了更加深刻的認識。