摘要:記住如中文如果是在的文件中,該字符串就是編碼,如果是在的文件中,則其編碼為。如果字符串是這樣定義中文則該字符串的編碼就被指定為了,即的內(nèi)部編碼,而與代碼文件本身的編碼無關(guān)。
寫在前面
一個(gè)很難找到問題所在的問題,后來是通過網(wǎng)上的博文才知道了是怎么樣的原因,reload(sys)不能隨便用,因?yàn)橐坏┲刂昧耍芏喹h(huán)境變量就不一樣了。
正文 搞搞編碼首先是問題的來源:
我在寫python腳本遇到了下面這個(gè)問題
UnicodeEncodeError: "ascii" codec can"t encode characters in position 0-1: ordinal not in range(128)
相當(dāng)不能理解,這其實(shí)就涉及了python里面相當(dāng)復(fù)雜的編碼的問題。在python中運(yùn)行的字符串都是unicode編碼的,為什么需要這么一個(gè)中間的編碼,其實(shí)是很有用的,保證了編碼與編碼之間的互通性。
首先,大家肯定知道encode和decode,用法如下
str = "dafd" unicode_str = str.decode("gb2312") #這表示將gb2312編碼的str轉(zhuǎn)化成unicode unicode_str.encode("utf-8") #這表示將unicode編碼的unicode_str轉(zhuǎn)化成utf-8編碼
因此,轉(zhuǎn)碼的時(shí)候一定要先搞明白,字符串str是什么編碼,然后decode成unicode,然后再encode成其他編碼
另外,
代碼中字符串的默認(rèn)編碼與代碼文件本身的編碼一致。記住!~
如:s="中文" 如果是在utf8的文件中,該字符串就是utf8編碼,如果是在gb2312的文件中, 則其編碼為gb2312。這種情況下,要進(jìn)行編碼轉(zhuǎn)換, 都需要先用decode方法將其轉(zhuǎn)換成unicode編碼, 再使用encode方法將其轉(zhuǎn)換成其他編碼。通常,在沒有指定特定的編碼方式時(shí),都是使用的系統(tǒng)默認(rèn)編碼創(chuàng)建的代碼文件。 如果字符串是這樣定義:s=u"中文" 則該字符串的編碼就被指定為unicode了,即python的內(nèi)部編碼, 而與代碼文件本身的編碼無關(guān)。因此,對(duì)于這種情況做編碼轉(zhuǎn)換,只需要直接使用encode方法將其轉(zhuǎn)換成指定編碼即可。
如果一個(gè)str已經(jīng)是unicode了,這時(shí)候再去decode就會(huì)出錯(cuò),很好理解。
獲得系統(tǒng)的默認(rèn)編碼
#!/usr/bin/env python #coding=utf-8 import sys print sys.getdefaultencoding() 該段程序在英文WindowsXP上輸出為:ascii 但其實(shí)在ubuntu里也是這樣的問題,這其實(shí)就是我寫這篇文章的初衷,因?yàn)槲冶贿@個(gè)問題困擾了很久! s = "你好" print s
輸出控制臺(tái)的編碼是ascii時(shí),如果你print的是unicode就會(huì)出現(xiàn)這個(gè)錯(cuò)誤:
UnicodeEncodeError: "ascii" codec can"t encode characters in position 0-1: ordinal not in range(128)
只要改成 print s.encode("utf-8")就ok了。
為什么要reload(sys)剛剛這么講好像就解決了?其實(shí)不是的,我有個(gè)函數(shù)tf.train.BytesList,這個(gè)函數(shù)的參數(shù)是一個(gè)str,但是這個(gè)str的編碼因?yàn)橄到y(tǒng)默認(rèn)編碼的原因出錯(cuò)了,就是上面的錯(cuò)。這時(shí)候的解決辦法一般是reload(sys)。
但是,你會(huì)看到卡住了?其實(shí)是輸出看不到了,網(wǎng)上有這樣的解答。
IDLE作為一個(gè)GUI Shell環(huán)境,在啟動(dòng)初始化過程中, 會(huì)設(shè)置特定的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出,使得輸入和輸出都在IDLE的GUI Shell中。 而如果手動(dòng)執(zhí)行了reload(sys)以后,sys模塊的這三個(gè)變量將會(huì)被重置, 導(dǎo)致輸出無法顯示在IDLE。所以解決方案很簡(jiǎn)單,只需要在reload之前把這三個(gè)變量都復(fù)制一份,reload之后再恢復(fù)回來就行了
上面的IDLE其實(shí)不只是IDLE,像我就是在jupyter的情況下出錯(cuò)的,terminal下也是一樣。所以要記得補(bǔ)上以下代碼:
stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr reload(sys) sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde
ok!就寫到這,祝大家coding愉快~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40826.html
摘要:從庫導(dǎo)入所需模塊,已經(jīng)是平臺(tái)事實(shí)上的圖像處理標(biāo)準(zhǔn)庫了。功能非常強(qiáng)大,但應(yīng)用程序界面卻非常簡(jiǎn)單易用。能訪問解釋器聯(lián)系緊密的變量和函數(shù)。 #0000 from PIL import Image,ImageFont,ImageDraw#從PIL庫導(dǎo)入所需模塊 #######PIL:Python Imaging Library,已經(jīng)是Python平臺(tái)事實(shí)上的圖像處理標(biāo)準(zhǔn)庫了。PIL功能非常強(qiáng)大...
摘要:我在中使用的時(shí)候,提示一直不知道是什么原因,通過查閱一個(gè)資料,才知道,原來是編碼問題。字符串在進(jìn)行的時(shí)候,要使用什么編碼格式進(jìn)行轉(zhuǎn)換呢這個(gè)時(shí)候就要根據(jù)來確定了。而是編碼,在字符表中不存在這種大于的字符存在。所以當(dāng)然會(huì)報(bào)錯(cuò)。 我在Linux中使用make html的時(shí)候,提示: UnicodeDecodeError: ascii codec cant decode byte 0xe5 i...
摘要:原因在安裝時(shí),默認(rèn)的編碼是,當(dāng)程序中出現(xiàn)非編碼時(shí),的處理常常會(huì)報(bào)這樣的錯(cuò),不過在就不會(huì)有這樣的問題。 1、原因 python2.7在安裝時(shí),默認(rèn)的編碼是ascii,當(dāng)程序中出現(xiàn)非ascii編碼時(shí),python的處理常常會(huì)報(bào)這樣的錯(cuò),不過在python3就不會(huì)有這樣的問題。 2、解決辦法 臨時(shí)解決方法: 代碼中加入如下三行import sys reload(sys) sys.setd...
摘要:模塊實(shí)現(xiàn)從程序外部向程序傳遞參數(shù)。位置參數(shù)代表文件本身,運(yùn)行方法參數(shù),參數(shù)。。是正常退出,其他為異常第次第五次退出模塊判斷現(xiàn)在正在實(shí)用的平臺(tái),返回返回得到當(dāng)前工作的目錄。指定所有目錄下所有的文件和目錄名。例檢驗(yàn)指定的對(duì)象是否存在。 sys模塊 sys.argv: 實(shí)現(xiàn)從程序外部向程序傳遞參數(shù)。 位置參數(shù)argv[0]代表py文件本身,運(yùn)行方法 python xx.py 參數(shù)1,參數(shù)2 ...
摘要:爬取數(shù)據(jù)提取標(biāo)題最終爬取了頁多個(gè)標(biāo)題分詞并統(tǒng)計(jì)詞的數(shù)量這里我使用了這個(gè)庫來分詞分出了個(gè)詞然后統(tǒng)計(jì)數(shù)量這里我統(tǒng)計(jì)了兩個(gè)詞以下和兩個(gè)詞以上的詞的量分配如圖生成詞云以及其他數(shù)據(jù)圖表這里我是用的庫生 爬取數(shù)據(jù) huputitle_spiders.py #coding:utf-8 import scrapy from huputitle.items import Huputitle...
閱讀 1714·2021-11-25 09:43
閱讀 2673·2019-08-30 15:53
閱讀 1827·2019-08-30 15:52
閱讀 2909·2019-08-29 13:56
閱讀 3330·2019-08-26 12:12
閱讀 570·2019-08-23 17:58
閱讀 2140·2019-08-23 16:59
閱讀 942·2019-08-23 16:21