最近參加了由CCF舉辦的數據挖掘比賽,主辦方提供了csv格式的數據文件,因爲中文顯示亂碼的問題,我先用txt文本編輯器將編碼改成utf-8格式,可是在讀取文件並輸出讀取結果時發生了問題,代碼以下:python
1 # -*- coding:utf-8 -*- 2 __author__ = 'Jz' 3 4 csvPath = 'D:/coding_file/python_file/Big Data/trainUTF8.csv' 5 try: 6 csv = open(csvPath, 'r') 7 lines = csv.readlines() 8 for line in lines: 9 print line.decode('utf-8').encode('GBK') 10 except IOError, ioe: 11 if hasattr(e, 'reason'): 12 print '文件打開失敗,失敗緣由:' + e.reason
運行結果以下:編輯器
顯然根據結果來看問題具體出如今print line.decode('utf-8').encode('GBK')這裏,按理說應該是沒有問題的,那麼問題到底出如今哪裏?編碼
後來搜索了不少相關資料,解決了問題,總結以下:Windows系統的txt文件在使用utf-8編碼保存時會默認在文件開頭插入三個不可見字符,稱爲BOM頭,這個BOM頭在python的codecs庫中已經定義爲常量。Windows根據BOM頭來判斷txt文件是否爲utf-8編碼,因此在讀取文件時必須將BOM頭去除或者忽略,不然python在decode和encode時會出現錯誤。spa
解決方法:code
1 # -*- coding:utf-8 -*- 2 __author__ = 'Jz' 3 4 import codecs 5 6 csvPath = 'D:/coding_file/python_file/Big Data/trainUTF8.csv' 7 try: 8 csv = open(csvPath, 'r') 9 lines = csv.readlines() 10 for line in lines: 11 print line.decode('utf-8').encode('gbk', 'ignore') 12 except IOError, ioe: 13 if hasattr(e, 'reason'): 14 print '文件打開失敗,失敗緣由:' + e.reason
ignore參數表示忽略其中有異常的編碼,僅顯示有效的編碼blog