中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Python文件編碼怎么理解

發布時間:2021-11-23 11:57:42 來源:億速云 閱讀:207 作者:iii 欄目:大數據

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

1、代碼編碼問題

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

1.1、案例1:

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

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

2、字符串編碼

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

2.1、字符串和字節互轉

字節是以 \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文件編碼怎么理解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绩溪县| 颍上县| 昌乐县| 康平县| 德昌县| 长泰县| 通海县| 太谷县| 邵阳市| 盐山县| 宽甸| 邯郸县| 福鼎市| 杭锦旗| 五寨县| 唐山市| 白水县| 称多县| 兴义市| 东港市| 新晃| 芦山县| 射阳县| 辽源市| 永德县| 安福县| 兰州市| 武冈市| 乐东| 洪湖市| 巍山| 溆浦县| 巴林右旗| 冷水江市| 扬州市| 临猗县| 化德县| 陵川县| 沛县| 驻马店市| 台江县|