版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Python編碼規(guī)范擺脫P(yáng)ython編碼噩夢(mèng)1.Python3中str與bytes2.Python2中str與unicode3.如何檢測(cè)對(duì)象的編碼4.編碼與解碼的區(qū)別5.如何設(shè)置文件編碼
博客原文:/en/latest/c01/c01_44.html
Github:/iswbm/PythonCodingTime
Python中編碼問(wèn)題,一直是很多Python開(kāi)發(fā)者的噩夢(mèng),盡管你是工作多年的Python開(kāi)發(fā)者,也肯定會(huì)經(jīng)常遇到令人神煩的編碼問(wèn)題,好不容易花了半天搞明白了。
一段時(shí)間后,又全都忘光光了,一臉懵逼的你又開(kāi)始你找各種博客、帖子,從頭搞清楚什么是編碼?什么是unicode?它和ASCII有什么區(qū)別?為什么decodeencode老是報(bào)錯(cuò)?python2里和python3的字符串類型怎么都不一樣,怎么對(duì)應(yīng)起來(lái)?如何檢測(cè)編碼格式?
反反復(fù)復(fù),這個(gè)過(guò)程真是太痛苦了。
今天我把大家在Python上會(huì)遇到的一些編碼問(wèn)題都講清楚了,以后你可以不用再Google,收藏這篇文章就行。
1.Python3中str與bytes
在Python3中,字符串有兩種類型,str和bytes。
今天就來(lái)說(shuō)一說(shuō)這二者的區(qū)別:
unicodestring(str類型):以Unicodecodepoints形式存儲(chǔ),人類認(rèn)識(shí)的形式
bytestring(bytes類型):以byte形式存儲(chǔ),機(jī)器認(rèn)識(shí)的形式
在Python3中你定義的所有字符串,都是unicodestring類型,使用type和isinstance可以判別
#python3
str_obj="你好"
type(str_obj)
class'str'
isinstance("你好",str)
isinstance("你好",bytes)
False
而bytes是一個(gè)二進(jìn)制序列對(duì)象,你只要你在定義字符串時(shí)前面加一個(gè)b,就表示你要定義一個(gè)bytes類型的字符串對(duì)象。
#python3
byte_obj=b"HelloWorld!"
type(byte_obj)
class'bytes'
isinstance(byte_obj,str)
False
isinstance(byte_obj,bytes)
但是在定義中文字符串時(shí),你就不能直接在前面加b了,而應(yīng)該使用encode轉(zhuǎn)一下。
byte_obj=b"你好"
File"stdin",line1
SyntaxError:bytescanonlycontainASCIIliteralcharacters.
str_obj="你好"
str_obj.encode("utf-8")
b'\xe4\xbd\xa0\xe5\xa5\xbd'
2.Python2中str與unicode
而在Python2中,字符串的類型又與Python3不一樣,需要仔細(xì)區(qū)分。
在Python2里,字符串也只有兩種類型,unicode和str。
只有unicodeobject和非unicodeobject(其實(shí)應(yīng)該叫strobject)的區(qū)別:
unicodestring(unicode類型):以Unicodecodepoints形式存儲(chǔ),人類認(rèn)識(shí)的形式bytestring(str類型):以byte形式存儲(chǔ),機(jī)器認(rèn)識(shí)的形式
當(dāng)我們直接使用雙引號(hào)或單引號(hào)包含字符的方式來(lái)定義字符串時(shí),就是str字符串對(duì)象,比如這樣
#python2
str_obj="你好"
type(str_obj)
type'str'
str_obj
'\xe4\xbd\xa0\xe5\xa5\xbd'
isinstance(str_obj,bytes)
isinstance(str_obj,str)
isinstance(str_obj,unicode)
False
strisbytes
而當(dāng)我們?cè)陔p引號(hào)或單引號(hào)前面加個(gè)u,就表明我們定義的是unicode字符串對(duì)象,比如這樣
#python2
unicode_obj=u"你好"
unicode_obj
u'\u4f60\u597d'
type(unicode_obj)
type'unicode'
isinstance(unicode_obj,bytes)
False
isinstance(unicode_obj,str)
False
isinstance(unicode_obj,unicode)
3.如何檢測(cè)對(duì)象的編碼
所有的字符,在unicode字符集中都有對(duì)應(yīng)的編碼值(英文叫做:codepoint)
而把這些編碼值按照一定的規(guī)則保存成二進(jìn)制字節(jié)碼,就是我們說(shuō)的編碼方式,常見(jiàn)的有:UTF-8,GB2312等。
也就是說(shuō),當(dāng)我們要將內(nèi)存中的字符串持久化到硬盤中的時(shí)候,都要指定編碼方法,而反過(guò)來(lái),讀取的時(shí)候,也要指定正確的編碼方法(這個(gè)過(guò)程叫解碼),不然會(huì)出現(xiàn)亂碼。
那問(wèn)題就來(lái)了,當(dāng)我們知道了其對(duì)應(yīng)的編碼方法,我們就可以正常解碼,但并不是所有時(shí)候我們都能知道應(yīng)該用什么編碼方式去解碼?
這時(shí)候就要介紹到一個(gè)python的庫(kù)–chardet,使用它之前需要先安裝
python3-mpipinstallchardet
chardet有一個(gè)detect方法,可以預(yù)測(cè)其其編碼格式
importchardet
chardet.detect('微信公眾號(hào):Python編程時(shí)光'.encode('gbk'))
{'encoding':'GB2312','confidence':0.99,'language':'Chinese'}
為什么說(shuō)是預(yù)測(cè)呢,通過(guò)上面的輸出來(lái)看,你會(huì)看到有一個(gè)confidence字段,其表示預(yù)測(cè)的可信度,或者說(shuō)成功率。
但是使用它時(shí),若你的字符數(shù)較少,就有可能“誤診”),比如只有中文兩個(gè)字,就像下面這樣,我們是使用gbk編碼的,使用chardet卻識(shí)別成KOI8-R編碼。
str_obj="中文"
byte_obj=bytes(a,encoding='gbk')#先得到一個(gè)gbk編碼的bytes
chardet.detect(byte_obj)
{'encoding':'KOI8-R','confidence':0.682639754276994,'language':'Russian'}
str_obj2=str(byte_obj,encoding='KOI8-R')
str_obj2
'жпнд'
所以為了編碼診斷的準(zhǔn)確,要盡量使用足夠多的字符。
chardet支持多國(guó)的語(yǔ)言,從官方文檔中可以看到支持如下這些語(yǔ)言(https://chardet.readthedocs.io/en/latest/supported-encodings.html)
4.編碼與解碼的區(qū)別
編碼和解碼,其實(shí)就是str與bytes的相互轉(zhuǎn)化的過(guò)程(Python2已經(jīng)遠(yuǎn)去,這里以及后面都只用Python3舉例)
編碼:encode方法,把字符串對(duì)象轉(zhuǎn)化為二進(jìn)制字節(jié)序列
解碼:decode方法,把二進(jìn)制字節(jié)序列轉(zhuǎn)化為字符串對(duì)象
那么假如我們真知道了其編碼格式,如何來(lái)轉(zhuǎn)成unicode呢?
有兩種方法
第一種是,直接使用decode方法
byte_obj.decode('gbk')
第二種是,使用str類來(lái)轉(zhuǎn)
str_obj=str(byte_obj,encoding='gbk')
str_obj
5.如何設(shè)置文件編碼
在Python2中,默認(rèn)使用的是ASCII編碼來(lái)讀取的,因此,我們?cè)谑褂肞ython2的時(shí)候,如果你的python文件里有中文,運(yùn)行是會(huì)報(bào)錯(cuò)的。
SyntaxError:Non-ASCIIcharacter'\xe4'infiledemo.py
原因就是ASCII編碼表太小,無(wú)法解釋中文。
而在Python3中,默認(rèn)使用的是uft-8來(lái)讀取,所以省了不少的事。
對(duì)于這個(gè)問(wèn)題,通常解決方法有兩種:
第一種方法
在python2中,可以使用在頭部指定
可以這樣寫(xiě),雖然很好看
#-*-coding:utf-8-*-
但這樣寫(xiě)太麻煩了,我通常使用下面兩種寫(xiě)法
#coding:utf-8
#coding=utf-8
第二種方法
importsys
reload(sys)
sys.setdefaultencoding('utf-8')
這里在調(diào)用sys.setdef
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026貴州中醫(yī)藥大學(xué)博士后招聘?jìng)淇碱}庫(kù)及1套完整答案詳解
- 2026貴州醫(yī)科大學(xué)附屬白云醫(yī)院養(yǎng)老護(hù)理員招聘8人備考題庫(kù)及答案詳解(奪冠系列)
- 寶寶皮膚護(hù)理與預(yù)防濕疹
- 2025 小學(xué)一年級(jí)道德與法治上冊(cè)獨(dú)自在家不害怕課件
- 2026年工地安全管理標(biāo)準(zhǔn)化建設(shè)
- 遠(yuǎn)程會(huì)診護(hù)理的經(jīng)濟(jì)效益
- 職業(yè)醫(yī)學(xué)與工程學(xué)的聯(lián)合防護(hù)模式
- 臨潭事業(yè)編招聘2022年考試模擬試題及答案解析42
- 職業(yè)健康素養(yǎng)對(duì)醫(yī)療員工組織承諾的預(yù)測(cè)作用
- 職業(yè)健康檔案電子化傳輸過(guò)程中的加密技術(shù)應(yīng)用
- 2026云南昭通市搬遷安置局招聘公益性崗位人員3人備考題庫(kù)及答案詳解(考點(diǎn)梳理)
- 2026中國(guó)電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘?jìng)淇碱}庫(kù)及一套答案詳解
- 2025-2030心理健康行業(yè)市場(chǎng)發(fā)展分析及趨勢(shì)前景與投資戰(zhàn)略研究報(bào)告
- 技術(shù)副總年終總結(jié)
- 《馬年馬上有錢》少兒美術(shù)教育繪畫(huà)課件創(chuàng)意教程教案
- 天津市專升本高等數(shù)學(xué)歷年真題(2016-2025)
- 2025年化工原理考試題及答案
- 湖南省益陽(yáng)市2024-2025學(xué)年高二上學(xué)期語(yǔ)文1月期末考試試卷(含答案)
- 幕墻工程售后質(zhì)量保障服務(wù)方案
- 鋁合金鑄造項(xiàng)目可行性研究報(bào)告
- 2024年西藏自治區(qū)事業(yè)單位《職業(yè)能力傾向測(cè)驗(yàn)(D類)》考試真題及答案
評(píng)論
0/150
提交評(píng)論