1. 程式人生 > >Python基礎(字符編碼與文件處理)

Python基礎(字符編碼與文件處理)

計算 穩定性 沖突 byte 過程 logs spa 多語 odin

一、了解字符編碼的知識儲備

 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基礎(字符編碼與文件處理)