您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python文件編碼怎么理解”,在日常操作中,相信很多人在Python文件編碼怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python文件編碼怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
相信很多小伙伴都聽說過這樣的話,Python3 的默認編碼方式是以 UTF-8,聽著有點玄幻,啥叫 Python 的默認編碼?
當(dāng)我們編譯運行一個py
文件(test.py)的時候,Python 編譯器首先會對文件 test.py
進行讀取,然后默認對數(shù)據(jù)進行 UTF-8
的解碼,然后編譯運行,程序跑了起來。
我們知道,數(shù)據(jù)的解碼和編碼都是成對的,且需要采取相同的編碼方式,否則解碼的數(shù)據(jù)就會和原數(shù)據(jù)不一樣。其實也類似于 AES 的解密和加密。
試想一下,test.py
文件是由一個文本編輯器以 GBK
的編碼方式寫入,此時采用默認的 UTF-8
方式進行解碼,就會造成亂碼情況。
不信的話,show code with you:
# 測試環(huán)境: OS: Mac os 10.15 IDE: Pycharm Python: Python3.8 Author: 西園公子
測試腳本 test.py
,腳本文件是以 UTF-8 編碼的方式保存的。
內(nèi)容:
# coding=gbk # Author: zwjjiaozhu # Date: 2021/1/8 # IDE: VsCode import sys print(sys.getdefaultencoding()) name = '小甲' print(f"name: {name}\n name_type: {type(name)}\n :{repr(name)}") with open('utf.txt', 'w', encoding='utf8') as f: f.write(name) with open('gbk.txt', 'w', encoding='gbk') as f: f.write(name)
結(jié)果:
utf-8 name: 灝忕敳 name_type: <class 'str'> :'灝忕敳' # 寫入文件內(nèi)容打?。ㄇ疤幔憾际且訳TF-8的解碼方式打開文本) 灝忕敳 小甲
此時你該困惑了,這都是啥呀?為啥打印顯示灝忕敳
。以 GBK
的方式寫入文件,卻內(nèi)容顯示正常為小甲
,以 UTF-8
的方式寫入文件卻顯示為灝忕敳
。
接下來我來講明白它:
上面的代碼首行添加了 # coding=gbk
,這就告訴編譯器需要使用GBK
的解碼方式對 test.py
文件進行解碼,轉(zhuǎn)成相應(yīng)的 Unicode
碼,然后就運行代碼了。
由于name = '小甲'
是中文,所以當(dāng)使用GBK進行解碼,翻譯成 Unicode 碼值
后,打印顯示后就出現(xiàn)了亂碼問題(也就是值不對應(yīng)的問題),其他的代碼啥的都是字母,不同的編碼解碼方式都是可以正常顯示的,誰讓是美國人發(fā)明的呢????
然后是寫入文件:
encoding='utf8' ,將編譯器解碼的 name 的值(灝忕敳)以UTF-8的編碼方式寫入文件utf.txt中,當(dāng)使用記事本打開utf.txt文件時,記事本默認是以UTF-8的解碼方式打開,就顯示 灝忕敳
了。編碼和解碼成對的,媒介是 UTF-8
encoding='gbk' ,同理,將編譯器解碼name后的Unicode值(灝忕敳對應(yīng)的Unicode值)以GBK的編碼方式寫入文件 gbk.tx t中。如果此時采用UTF-8的解碼方式打開這個文本,就會顯示小甲
正常,如果采用GBK的方式打開,那不好意思,還是顯示 灝忕敳
。相當(dāng)于是 python編譯器對 test.py 的 GBK 解碼和寫入文件的GBK編碼抵消,得到的就是最開始的 test.py 以UTF-8編碼的數(shù)據(jù)。
可能你還是不太懂,強烈推薦手動畫畫草圖,這里我畫一個流程圖,以加深理解~
哇好累呀,肝的我腦疼,總算解釋清楚了,
在 Python 內(nèi)部中有兩種常見格式,字符串和字節(jié) bytes類型,在網(wǎng)絡(luò)傳輸中以及寫入文件時,通常是轉(zhuǎn)成bytes。例如:"你好"
和 b“\xe4\xbd\xa0\xe5\xa5\xbd”
(utf-8編碼的) ,兩者是等價的。
字節(jié)是以 \x
開頭后跟16進制數(shù)
方式1,使用encode和decode方式直接轉(zhuǎn)
name = "你好" name_bytes = name.encode("utf8") # 用utf8進行編碼,用gbk或者ascii都行 name2 = name_bytes.decode("utf8") # 同樣的必須使用用utf8進行解碼,做到編碼和解碼是對應(yīng)的,才不會亂碼 print(f"name:{name},type:{type(name)}") print(f"name_bytes:{name_bytes},type:{type(name_bytes)}") print(f"name2:{name2},type:{type(name2)}") # 結(jié)果: # name:你好,type:<class 'str'> # name_bytes:b'\xe4\xbd\xa0\xe5\xa5\xbd',type:<class 'bytes'> # name2:你好,type:<class 'str'>
方式2,使用 str 和 bytes 轉(zhuǎn)
age = '12' age_bytes = bytes(age, encoding="utf8") age_str = str(age_bytes.decode("utf8")) print(f"age:{age},type:{type(age)}") print(f"age_bytes:{age_bytes},type:{type(age_bytes)}") print(f"age_str:{age_str},type:{type(age_str)}") # 結(jié)果: # age:12,type:<class 'str'> # age_bytes:b'12',type:<class 'bytes'> # age_str:12,type:<class 'str'>
說明:字符串在Python內(nèi)部也就是內(nèi)存中是以 Unicode 方式存在,因此,在做編碼轉(zhuǎn)換時,通常需要以 Unicode 作為中間編碼,即先將其他編碼的字符串解碼(decode)成 Unicode ,再將unicode編碼(encode)成另一種編碼。
decode
的作用是將 bytes 字節(jié)
解碼成 str 類型字符串
,如str1.decode('gb2312'),表示將字符串 str1 以gb2312 的解碼
方式解碼轉(zhuǎn)換成 str 類型,也就是 Python 的str
類型 。
encode
的作用是將 str 類型字符串
編碼轉(zhuǎn)換成 bytes 字節(jié)
,如str2.encode('gb2312'),表示字符串 str2 以gb2312 的編碼
方式轉(zhuǎn)換成 bytes 類型。因此,轉(zhuǎn)碼的時候一定要先搞明白,數(shù)據(jù) str1 是什么編碼,用什么方式編碼的,就用什么方式解碼。
到此,關(guān)于“Python文件編碼怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。