當我們剛剛開始學習處理大量的文字資料的時候,總是會在讀取資料這一塊出現卡殼,尤其是像我這種根本沒有任何指導的小白,千里之行剛剛邁出第一步就宣告結束了,這種情況往往出現在我們自己爬取的一些網路文字,一般是txt檔案。下面就讓我們看看具體怎麼解決這樣的問題。
這邊我們主要講關於文字的讀取,涉及到二進位制檔案的讀取就不多提了。首先讓我們看看,正常的情況下,我們是怎麼樣去讀取乙個文字資料的。
# read the entire file as a single string
with open('somefile.txt', 'rt') as f:
data = f.read()
# iterate over the lines of the file
with open('somefile.txt', 'rt') as f:
for line in f:
# process line
...
我想這是大部分人開始接觸文字處理的時候,最先想到的處理方法,但是事實上我們讀取的文字其實還有很多種形式的編碼的,比如 ascii, utf-8,gbk 或 utf-16 編碼等。上面的**我們是預設呼叫系統的編碼來讀取你需要讀取的文字資料的。
in [1]: import sys
in [2]: sys.getdefaultencoding()
out[2]: 'utf-8'
你可以使用上面的**去檢視你系統預設的編碼形式是什麼。這裡就不得不提一下坑害我們許久的gbk編碼,也就是windows系統預設的編碼,直接讀經常讀不了資料,所以給大家的建議是,編碼環境還是最好在linux或者mac下,避免一些不必要的麻煩。當然建議總歸是建議,微軟的系統是不可能輕易放棄的,所以當我們遇到編碼的問題的時候,如果我們事先知道這文字的編碼形式的時候我們就可以使用相應的編碼形式來讀取啦,這樣也就不存在讀取上面的問題啦。
with open('somefile.txt', 'rt', encoding='latin-1') as f:
...
當你要在windows上讀取乙個utf-8的文字的時候,你就可以使用這樣的**,把encoding = 『utf-8』, 這樣就能順利地讀出啦。
python 支援非常多的文字編碼。幾個常見的編碼是 ascii, latin-1, utf-8 和 utf-16。在 web 應用程式中通常都使用的是 utf-8。 ascii 對應從 u+0000 到 u+007f 範圍內的 7 位字元。 latin-1 是位元組 0-255 到 u+0000 至 u+00ff 範圍內 unicode 字元的直接對映。
下面放出讀文字編碼出錯的示例:
>>> f = open('sample.txt', 'rt', encoding='ascii')
>>> f.read()
traceback (most recent call last):
file
"", line 1, in
file
"/usr/local/lib/python3.3/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
unicodedecodeerror: 'ascii' codec can't decode byte 0xc3
in position
12: ordinal not
inrange(128)
>>>
當我們不知道乙個陌生文字是什麼編碼的時候,我們該怎麼辦呢,乙個個去試聽著好像是個靠譜的方法,但是如果乙個文字如果採用了多種文字編碼方式呢,那麼你不管怎麼設定總還是有無法編碼的字元的,這時候就很尷尬啦。這時候我們應該這麼辦:
>>>
# replace bad chars with unicode u+fffd replacement char
>>> f = open('sample.txt', 'rt', encoding='ascii', errors='replace')
>>> f.read()
'spicy jalape?o!'
>>>
# ignore bad chars entirely
>>> g = open('sample.txt', 'rt', encoding='ascii', errors='ignore')
>>> g.read()
'spicy jalapeo!'
>>>
忽略錯誤是個治標的方法,但是每次都這麼處理那就很糟糕啦。這時候給大家的建議有兩個,最好預設utf-8編碼,還有乙個就是當讀取乙個未知編碼的文字時使用 latin-1 編碼永遠不會產生解碼錯誤。使用latin-1 編碼讀取乙個檔案的時候也許不能產生完全正確的文字解碼資料,但是它也能從中提取出足夠多的有用資料。同時,如果你之後將資料回寫回去,原先的資料還是會保留的。
ok,常見的文字讀取問題也就是這些啦。
編碼實現讀取文字的方法
net framework 3.0 中增加了乙個命名空間 system.speech 使用這個空間的類和方法,我們可以很方便的2行 就可以讓一段文字被讀出來。演示 如下 using system.speech.synthesis speechsynthesizer synth new speechs...
編碼實現讀取文字的方法
net framework 3.0 中增加了乙個命名空間 system.speech 使用這個空間的類和方法,我們可以很方便的2行 就可以讓一段文字被讀出來。演示 如下 using system.speech.synthesis speechsynthesizer synth new speechs...
編碼實現讀取文字的方法
2007年05月10日 13 11 00 net framework 3.0 中增加了乙個命名空間 system.speech 使用這個空間的類和方法,我們可以很方便的2行 就可以讓一段文字被讀出來。演示 如下 using system.speech.synthesis speechsynthesi...