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