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

來源:互聯網
上載者:User

標籤:roc   ret   unicode   使用   作用   log   net   targe   命令   

做爬蟲向檔案寫入時,出現寫入錯誤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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.