最近參加了由CCF舉辦的數據挖掘比賽,主辦方提供了csv格式的數據文件,由於中文顯示亂碼的問題,我先用txt文本編輯器將編碼改為utf-8格式,但是在讀取文件並輸出讀取結果時發生了問題,代碼如下:
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時會出現錯誤。
解決方法:
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參數表示忽略其中有異常的編碼,僅顯示有效的編碼