溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python文件編碼怎么理解

發(fā)布時間:2021-11-23 11:57:42 來源:億速云 閱讀:199 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Python文件編碼怎么理解”,在日常操作中,相信很多人在Python文件編碼怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python文件編碼怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

1、代碼編碼問題

相信很多小伙伴都聽說過這樣的話,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: 西園公子

1.1、案例1:

測試腳本 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文件編碼怎么理解 Python文件編碼怎么理解

哇好累呀,肝的我腦疼,總算解釋清楚了,

2、字符串編碼

在 Python 內(nèi)部中有兩種常見格式,字符串和字節(jié) bytes類型,在網(wǎng)絡(luò)傳輸中以及寫入文件時,通常是轉(zhuǎn)成bytes。例如:"你好" b“\xe4\xbd\xa0\xe5\xa5\xbd”(utf-8編碼的) ,兩者是等價的。

2.1、字符串和字節(jié)互轉(zhuǎn)

字節(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>

向AI問一下細節(jié)

免責(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)容。

AI