UnicodeEncodeError: 'ascii' codec can't encode characters in
做爬蟲向文件寫入時,出現寫入錯誤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