Python基礎(字符編碼與文件處理)
一、了解字符編碼的知識儲備
1、計算機基礎知識(三副圖)
2、文本編輯器存取文件的原理(notepad++,Pycharm,word)
打開編輯器就啟動了一個進程,是在內存中運行的,所以在編輯器寫的內容在沒保存之前都是存放在內存中的,斷電後數據就會丟失。因而需要保存到硬盤上,點擊保存按鈕,就從內存中把數據刷到硬盤上。
3、Python解釋器執行py文件的與原理,例如python test.py
第一階段:python解釋器啟動,此時就相當於啟動了一個文本編輯器。
第二階段:python解釋器相當於文本編輯器,去打開test.py文件,從硬盤將test.py的文件內容讀到內存中。
第三階段:python解釋器解釋執行剛剛加載到內存中test.py的代碼。(PS:在該階段,即執行時,才會識別python的語法,執行文件內代碼,執行到name=‘tracy‘,會開辟內存空間存放字符串‘tracy‘)
總結:python解釋器與文本編輯器的異同
相同點:python解釋器是執行文件內容的,因而python解釋器具備都py文件的功能,這一點與文本編輯器一樣
不同點:文本編輯器將文件內容讀入內存後,是未來顯示/編輯,而python解釋器將文件讀入內存後,是為了執行(識別python語法)
二、什麽是字符編碼
計算機要想工作必須通電,也就是說電驅使計算機幹活,而電的特性,就是高低電平。(高低電平即二進制數1,低電平即二進制0),也就是說計算機只認識數字。
如何能讓計算機讀懂人類的字符?
字符----->(翻譯過程)------>數字
這個過程實際就是一個字符如何對應一個特定數字的標準,這個標準稱之為字符編碼。
三、字符編碼的發展史
階段一:現代計算機起源於美國,最早誕生也是基於英文考慮的ASCII
ASCII:一個Bytes代表一個字符(英文字符/鍵盤上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1種變化,即可表示256個字符。
階段二:為了滿足中文,中國人定制了GBK
GBK:2Bytes代表一個字符
階段三:日本人定制了Shift_JIS,韓國人定制了Euc-kr等等
小結:各國有各國的標準,就會有不可避免的沖突,結果就是,在多語言混合的文本中,顯示出來就會有亂碼。
於是產生了Unicode,同意用2B有特色代表一個字符,2**16-1=65535,可代表6萬多個字符,因而兼容萬國語言。
但是對於通篇都是英文的文本來說,這種編碼方式無疑是多了一倍的存儲空間。於是產生了utf-8,對英文字符只用1Bytes表示,對中文字符用3Bytes表示。
unicode特性:簡單粗暴,所有字符都是2Bytes,優點是字符->數字的轉換速度快,缺點是占用空間打。
utf-8特性:精準,對不同的字符用不同的長度表示,有點是節省空間,缺點是:字符-->數字的轉換速度慢,因為每次都需要計算出字符需要多長的Bytes才能夠準確表示。
內存中使用的編碼是Unicode,用空間換時間。
硬盤中或者網絡傳輸用utf-8,網絡I/O延遲或者磁盤I/O延遲要遠大於utf-8的轉換延遲,而且I/O應該是盡可能地節省帶寬,保證數據傳輸的穩定性。
四、字符編碼的使用
文本編輯器轉換圖
Unicode--->encode----->utf-8
uft-8--------->decode----->Unicode
分析字符轉換過程:
文件從內存刷到硬盤的操作簡稱存文件
文件從硬盤讀到內存的操作簡稱讀文件
分析亂碼:
1、存文件時就已經亂碼的情況;
2、存文件時不亂碼而讀文件時亂碼;
小結:
無論是何種編輯器,要防止文件出現亂碼(請一定註意,存放一段代碼的文件也僅僅只是一個普通文件而已,此處指的是文件沒有執行前,我們打開文件時出現的亂碼)
核心法則就是,文件以什麽編碼保存的,就以什麽編碼方式打開。
python2默認ASCII,python3默認utf-8,除非文件頭部指定編碼方式。
針對python3如下圖;
在瀏覽網頁的時候,服務器會吧動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器
如果服務端encode的編碼格式是utf-8,客戶端內存中收到的也是uft-8編碼的二進制。
在python3中也有兩種字符串類型str和bytes
str是Unicode
#coding:utf-8
s=‘林‘ #當程序執行時,無需加u,‘林‘也會被以unicode形式保存新的內存空間中, #s可以直接encode成任意編碼格式 s.encode(‘utf-8‘) s.encode(‘gbk‘) print(type(s)) #<class ‘str‘>
bytes是bytes
#coding:utf-8 s=‘林‘ #當程序執行時,無需加u,‘林‘也會被以unicode形式保存新的內存空間中, #s可以直接encode成任意編碼格式 s1=s.encode(‘utf-8‘) s2=s.encode(‘gbk‘) print(s) #林 print(s1) #b‘\xe6\x9e\x97‘ 在python3中,是什麽就打印什麽 print(s2) #b‘\xc1\xd6‘ 同上 print(type(s)) #<class ‘str‘> print(type(s1)) #<class ‘bytes‘> print(type(s2)) #<class ‘bytes‘>
Python基礎(字符編碼與文件處理)