国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python學習筆記 --- setdefaultencoding() : reload(sys)后

Object / 3587人閱讀

摘要:記住如中文如果是在的文件中,該字符串就是編碼,如果是在的文件中,則其編碼為。如果字符串是這樣定義中文則該字符串的編碼就被指定為了,即的內部編碼,而與代碼文件本身的編碼無關。

寫在前面

一個很難找到問題所在的問題,后來是通過網上的博文才知道了是怎么樣的原因,reload(sys)不能隨便用,因為一旦重置了,很多環境變量就不一樣了。

正文 搞搞編碼

首先是問題的來源:

我在寫python腳本遇到了下面這個問題

UnicodeEncodeError: "ascii" codec can"t encode characters in position 0-1: ordinal not in range(128)

相當不能理解,這其實就涉及了python里面相當復雜的編碼的問題。在python中運行的字符串都是unicode編碼的,為什么需要這么一個中間的編碼,其實是很有用的,保證了編碼與編碼之間的互通性。

首先,大家肯定知道encode和decode,用法如下

str = "dafd"
unicode_str = str.decode("gb2312") #這表示將gb2312編碼的str轉化成unicode
unicode_str.encode("utf-8") #這表示將unicode編碼的unicode_str轉化成utf-8編碼

因此,轉碼的時候一定要先搞明白,字符串str是什么編碼,然后decode成unicode,然后再encode成其他編碼

另外,
代碼中字符串的默認編碼與代碼文件本身的編碼一致。記住!~

如:s="中文"

如果是在utf8的文件中,該字符串就是utf8編碼,如果是在gb2312的文件中,
則其編碼為gb2312。這種情況下,要進行編碼轉換,
都需要先用decode方法將其轉換成unicode編碼,
再使用encode方法將其轉換成其他編碼。通常,在沒有指定特定的編碼方式時,都是使用的系統默認編碼創建的代碼文件。 

如果字符串是這樣定義:s=u"中文"

則該字符串的編碼就被指定為unicode了,即python的內部編碼,
而與代碼文件本身的編碼無關。因此,對于這種情況做編碼轉換,只需要直接使用encode方法將其轉換成指定編碼即可。

如果一個str已經是unicode了,這時候再去decode就會出錯,很好理解。

獲得系統的默認編碼

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()  

該段程序在英文WindowsXP上輸出為:ascii 
但其實在ubuntu里也是這樣的問題,這其實就是我寫這篇文章的初衷,因為我被這個問題困擾了很久!

s = "你好"
print s

輸出控制臺的編碼是ascii時,如果你print的是unicode就會出現這個錯誤:

UnicodeEncodeError: "ascii" codec can"t encode characters in position 0-1: ordinal not in range(128)

只要改成 print s.encode("utf-8")就ok了。

為什么要reload(sys)

剛剛這么講好像就解決了?其實不是的,我有個函數tf.train.BytesList,這個函數的參數是一個str,但是這個str的編碼因為系統默認編碼的原因出錯了,就是上面的錯。這時候的解決辦法一般是reload(sys)。

但是,你會看到卡住了?其實是輸出看不到了,網上有這樣的解答。

IDLE作為一個GUI Shell環境,在啟動初始化過程中,
會設置特定的標準輸入、標準輸出和標準錯誤輸出,使得輸入和輸出都在IDLE的GUI Shell中。
而如果手動執行了reload(sys)以后,sys模塊的這三個變量將會被重置,
導致輸出無法顯示在IDLE。所以解決方案很簡單,只需要在reload之前把這三個變量都復制一份,reload之后再恢復回來就行了

上面的IDLE其實不只是IDLE,像我就是在jupyter的情況下出錯的,terminal下也是一樣。所以要記得補上以下代碼:

stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr
reload(sys)
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde

ok!就寫到這,祝大家coding愉快~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40826.html

相關文章

  • #0000在一個圖片上畫一個數字

    摘要:從庫導入所需模塊,已經是平臺事實上的圖像處理標準庫了。功能非常強大,但應用程序界面卻非常簡單易用。能訪問解釋器聯系緊密的變量和函數。 #0000 from PIL import Image,ImageFont,ImageDraw#從PIL庫導入所需模塊 #######PIL:Python Imaging Library,已經是Python平臺事實上的圖像處理標準庫了。PIL功能非常強大...

    BearyChat 評論0 收藏0
  • Python中一個編碼的錯誤

    摘要:我在中使用的時候,提示一直不知道是什么原因,通過查閱一個資料,才知道,原來是編碼問題。字符串在進行的時候,要使用什么編碼格式進行轉換呢這個時候就要根據來確定了。而是編碼,在字符表中不存在這種大于的字符存在。所以當然會報錯。 我在Linux中使用make html的時候,提示: UnicodeDecodeError: ascii codec cant decode byte 0xe5 i...

    Alfred 評論0 收藏0
  • python】[轉載]UnicodeEncodeError: 'ascii'

    摘要:原因在安裝時,默認的編碼是,當程序中出現非編碼時,的處理常常會報這樣的錯,不過在就不會有這樣的問題。 1、原因 python2.7在安裝時,默認的編碼是ascii,當程序中出現非ascii編碼時,python的處理常常會報這樣的錯,不過在python3就不會有這樣的問題。 2、解決辦法 臨時解決方法: 代碼中加入如下三行import sys reload(sys) sys.setd...

    Airy 評論0 收藏0
  • pythonsys,os,time模塊的使用(包括時間格式的各種轉換)

    摘要:模塊實現從程序外部向程序傳遞參數。位置參數代表文件本身,運行方法參數,參數。。是正常退出,其他為異常第次第五次退出模塊判斷現在正在實用的平臺,返回返回得到當前工作的目錄。指定所有目錄下所有的文件和目錄名。例檢驗指定的對象是否存在。 sys模塊 sys.argv: 實現從程序外部向程序傳遞參數。 位置參數argv[0]代表py文件本身,運行方法 python xx.py 參數1,參數2 ...

    mochixuan 評論0 收藏0
  • Scrapy爬取hupu論壇標題統計數量并生成wordcloud

    摘要:爬取數據提取標題最終爬取了頁多個標題分詞并統計詞的數量這里我使用了這個庫來分詞分出了個詞然后統計數量這里我統計了兩個詞以下和兩個詞以上的詞的量分配如圖生成詞云以及其他數據圖表這里我是用的庫生 爬取數據 huputitle_spiders.py #coding:utf-8 import scrapy from huputitle.items import Huputitle...

    renweihub 評論0 收藏0

發表評論

0條評論

Object

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<