1. 程式人生 > >UnicodeEncodeError: 'ascii' codec can't encode characters in

UnicodeEncodeError: 'ascii' codec can't encode characters in

sheng server tde num 設計者 encode 重置 不起作用 .py

做爬蟲向文件寫入時,出現寫入錯誤UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in .............

問題產生的原因:寫入的部分內容不能用ASCII編碼。

因為默認的編碼格式是ascii,所以

百度上許多解決方案即是

import sys

reload(sys)

sys.setdefaultencoding(‘utf-8‘)

即修改默認編碼為utf-8

但之後再GUI上操作其他指令時,會有顯示不正常的問題

借用博主

chaoshengmingyue的文章

《《《《《《《《通常大多數人執行reload(sys)這條語句其實僅僅是為了能夠修改Python的默認字符集,也就是能夠調用sys.setdefaultencoding()。但是如果在IDLE中執行reload(sys),就會導致接下來無法正常執行任何命令。

起初遇到這個問題也是束手無策,後來無意間在stackoverflow上看到有人說到了這個問題。原來是因為IDLE作為一個GUI Shell環境,在啟動初始化過程中,會設置特定的標準輸入、標準輸出和標準錯誤輸出,使得輸入和輸出都在IDLE的GUI Shell中,可以在IDLE中通過如下方式查看:

>>> import sys  
>>> print sys.stdin  
<idlelib.PyShell.PseudoInputFile object at 0x00000000027AF2E8>  
>>> print sys.stdout  
<idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320>  
>>> print sys.stderr  
<idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF358>  
>>>   

而如果手動執行了reload(sys)以後,sys模塊的這三個變量將會被重置,導致輸出無法顯示在IDLE。所以解決方案很簡單,只需要在reload之前把這三個變量都復制一份,reload之後再恢復回來就行了:

>>> stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr  
>>> reload(sys)  
>>> sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde  
>>> print sys.stdout  
<idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320>  
>>>   

細心的人可能會想到,reload(sys)之後,如果標準輸入、標準輸出和標準錯誤輸出都不起作用了,那麽relaod(sys)後面那一句sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde怎麽能夠執行呢?所以其實reload(sys)之後、恢復之前,標準輸入還是可以正常工作的,可以通過如下代碼來檢驗:

>>> reload(sys)  
>>> sys.stdout=stdo  
>>> print sys.stdin  
<open file ‘<stdin>‘, mode ‘r‘ at 0x0000000001CAB030>  
>>> print sys.stdout  
<idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320>  
>>> print sys.stderr  
<open file ‘<stderr>‘, mode ‘w‘ at 0x0000000001CAB150>  
>>>   

所以問題就解決了,但是必須要強調:

千萬不要輕易使用reload(sys),除非你完全清除這麽做帶來的結果!僅僅為了能夠重新設定Python的默認編碼就執行reload(sys)更是非常不明智的行為!

Python的設計者故意在Python初始化完成以後刪除sys模塊裏面的setdefaultencoding()方法,就是為了不讓在運行時隨意更改Python默認編碼,以免出現一些未知的問題。事實上,關於編碼問題,完全有別的更可靠的方法解決。》》》》》》》》

那麽最佳的解決方法是什麽呢,就是借助codecs模塊

f=codecs.open(‘file.txt‘,‘a‘,‘utf-8‘)

之後再寫入就沒有問題了!

UnicodeEncodeError: 'ascii' codec can't encode characters in