Python 報編碼錯誤 UnicodeDecodeError 解決辦法

  • 錯誤:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 894: invalid start byte
  • 指向位置:

  • 緣由:
data = open(filepath, 'rt', encoding='utf-8')
  •  解決辦法:讀取文件時加error屬性
data = open(filepath, 'rt', encoding='utf-8',errors='replace')

 主要緣由:所讀取的文件中有亂碼,可能是從網頁爬取,而造成的亂碼字符html

過程:java

  • 開始覺得是編碼問題,定位到編碼問題,實際上是方向錯誤。

對於編碼問題的解釋太多了:python

參考:http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html通俗的方式說明編碼問題的由來和多種解決方式segmentfault

參考:http://www.tuicool.com/articles/6RNv22y只是解決問題型網絡

python2中解決方法  參考:http://www.cnblogs.com/zhaoyl/p/3770340.htmlapp

在前面加上如下代碼便可函數

import sys 
reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,咱們須要從新載入 
sys.setdefaultencoding('utf-8')

而在Python3中:若是在控制檯中運行,就遇到了以下的UnicodeEncodeError:測試

1.緣由 #參考了http://www.tuicool.com/articles/nEjiEvui

首先,代碼中的html.text會自動將獲取的內容解析爲unicode  (與html.content不一樣。二者區別就是html.content的類型是bytes,而html.text類型是str,bytes經過解碼(decode)能夠獲得st r,str經過編碼(encode)獲得bytes)    html.text這種字符串若是要輸出應當用utf-8來編碼。而cmd中,(對於多數中國人所用的是中文的系統)默認字符編碼是gbkthis

從而致使此種現象:python要將utf-8編碼的字符串,在gbk的cmd的中打印出來。因而出現了編碼錯誤

2.解決方法  原文中在貼了含有真正解決方法的網頁的網址,

http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution/ 

我最終辦法就是使用Pycharm這個IDE來運行查看結果,中文部分就能正常顯示了。

至於如何在cmd上解決print的問題我仍然不知道如何解決。

寫入文件時引起的UnicodeEncodeError:

參考:https://segmentfault.com/a/1190000004269037

在測試過程當中屢次出如今寫入文件時報告錯誤「UnicodeEncodeError: 'ascii' codec can't encode character '\u56de' in position 0: ordinal not in range(128)」,這是因爲咱們在抓取網頁的時候採用的是UTF-8編碼,而存儲時沒有指定編碼,在存儲到文件的過程當中就會報錯。

解決辦法爲:在讀取文件時加入指定UTF-8編碼的選項

f = open('content.txt','a',encoding='UTF-8')

另外須要注意的是使用requests獲取到網頁以後一樣要指定編碼

html = requests.get(url)
html = re.sub(r'charset=(/w*)', 'charset=UTF-8', html.text)

另外:關於編碼問題

參考:如下網址(幾乎包含了能遇到的問題,做者善於總結,並一一講述問題和解決思路)

http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution/(找我本身的筆記本)

總結 2017.05.10:

1. 若是遇到編碼問題,首先,是否添加encoding屬性;其次,「文件編碼」與「讀取編碼」是否一致;最後,是否須要進行專門的編碼轉換。

2. 就讀取文件自己來講,可進行模式設置,即迴歸官網

open(file, mode='r', buffering=-1, encoding=None, errors=None, 
newline=None, closefd=True, opener=None)
  •  
    Character Meaning
    'r' open for reading (default)
    'w' open for writing, truncating the file first
    'x' open for exclusive creation, failing if the file already exists
    'a' open for writing, appending to the end of the file if it exists
    'b' binary mode
    't' text mode (default)
    '+' open a disk file for updating (reading and writing)
    'U' universal newlines mode (deprecated)
  • Error Handlers¶ 主要涉及如下三種方法 固然還有其餘,須要的時候去看

  • Value Meaning
    'strict' Raise UnicodeError (or a subclass); this is the default. Implemented instrict_errors().
    'ignore' Ignore the malformed data and continue without further notice. Implemented inignore_errors().

    The following error handlers are only applicable to text encodings:

    Value Meaning
    'replace' Replace with a suitable replacement marker; Python will use the official U+FFFDREPLACEMENT CHARACTER for the built-in codecs on decoding, and ‘?’ on encoding. Implemented in replace_errors().

3. 着手解決文本自己的問題,不要讓其出現亂碼。如原文原本自網絡爬蟲(致使編碼問題)。 

請尊重勞動成果:http://www.javashuo.com/article/p-gdgqqxul-ep.html

相關文章
相關標籤/搜索