python csv 格式文件 中文亂碼問題解決方法

我遇到的問題是使用pandas的DataFrame to_csv方法實現csv文件輸出,但是遇到中文亂碼問題,已驗證的正確的方法是:

df.to_csv("cnn_predict_result.csv",encoding="utf_8_sig")

-----------------------------------------------------------------------------------------------------------------------------------------------------

轉載:

使用python2處理中文時,經常會出現亂碼問題,之前使用Python處理中文csv文件時,處理過程程序輸出出現了亂碼,最後在程序中能夠正常顯示出中文,但是導出文件時,使用excel打開出現了中文亂碼問題,但是使用ultraedit打開時,能正常顯示。現在找到了問題的所在,總結如下:


1)程序輸出中出現亂碼的原因是因爲python2中中文編碼的問題,需要注意的是要將處理的中文文件的編碼和python源文件的編碼保持一致,這樣不會出現中文亂碼。可以參考這兩篇文章關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定Python中用encoding聲明的文件編碼和文件的實際編碼之間的關係

2)在程序中能夠正常輸出中文,但是導出到文件後使用excel打開是出現中文亂碼是因爲excel能夠正確識別用gb2312、gbk、gb18030或utf_8 with BOM 編碼的中文,如果是utf_8 no BOM編碼的中文文件,excel打開會亂碼。


根據以上兩點,結合自己的情況:我使用的是jupyter的ide,創建的python源文件爲utf8 no BOM格式的編碼,而要處理的csv文件是用gbk編碼的,所以我需要將使用gbk編碼的csv文件轉爲utf_8編碼。


[python] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. import codecs  
  2.   
  3. def ReadFile(filePath,encoding):  
  4.     with codecs.open(filePath,"r",encoding) as f:  
  5.         return f.read()  
  6. def WriteFile(filePath,u,encoding):  
  7.     with codecs.open(filePath,"w",encoding) as f:  
  8.         f.write(u)  
  9. ''''' 
  10. 定義GBK_2_UTF8方法,用於轉換文件存儲編碼 
  11. '''  
  12. def GBK_2_UTF8(src,dst):  
  13.     content = ReadFile(src,encoding='gbk')  
  14.     WriteFile(dst,content,encoding='utf_8')  
  15.       
  16.   
  17. ''''' 
  18. qyx.csv文件使用GBK編碼存儲,現在將其轉爲UTF_8存儲 
  19. '''  
  20. src = 'qyx.csv'  
  21. dst = 'qyx_utf8.csv'  
  22. GBK_2_UTF8(src,dst)  


使用上面的代碼能夠將使用GBK編碼的文件轉爲UTF8編碼的文件。接下來就是真正處理csv文件了。

[python] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. import pandas as pd  
  2. from urllib import unquote  
  3.   
  4. ''''' 
  5. 讀取轉換存儲格式後的文件 
  6. '''  
  7. path = 'qyx_utf8.csv'  
  8. data = pd.read_csv(path,)  
  9. data.head()  



處理csv文件:

[python] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. ''''' 
  2. 使用unquote方法對第三列的url進行decode 
  3. '''  
  4. #data['newcol'] = data[u'關鍵詞代碼'].map(unquote) #這樣會導致key識別錯誤,正確做法應該是去掉u  
  5. data['newcol'] = data['關鍵詞代碼'].map(unquote)#也可以使用ix來取得第三列的數據  
  6. #data['newcol'] = data.ix[:,3].map(unquote)  
  7.   
  8. data.head()  



將data導出到文件中:

[python] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. ''''' 
  2. 將結果導出到result.csv中,以UTF_8 with BOM編碼(微軟產品能正確識別UTF_8 with BOM存儲的中文文件)存儲 
  3. '''  
  4. #data.to_csv('result_utf8_no_bom.csv',encoding='utf_8')#導出的結果不能別excel正確識別  
  5. data.to_csv('result_utf8_with_bom.csv',encoding='utf_8_sig')  

使用excel打開result_utf8_no_bom.csv和result_utf8_with_bom.csv,發現能夠正確識別result_utf8_with_bom.csv文件



轉自:http://blog.csdn.net/xw_classmate/article/details/51940430

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章