Python讀取UTF-8編碼文件並使用命令行執行時輸出結果的問題

最近參加了由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

相關文章
相關標籤/搜索