什麼是字符編碼?神級程序員完全解剖分析!(原來如此)

如果你還在入門糾結,如果你還在苦惱怎麼入門python!小編有個建議,可以加小編弄的一個Python交流基地,大家可以進入交流基地:58937142,裡面新手入門資料,可以說從零到項目實戰,都是可以免費獲取的,還有程序員大牛為各位免費解答問題,熱心腸的小夥伴也是蠻多的。不失為是一個交流的的好地方,小編在這裡邀請大家加入我的大家庭。歡迎你的到來。一起交流學習!共同進步!小編等你!

用文本編輯器打開一個文件就是把一個文件讀入了內存中 ,所以打開文件的操作也是在內存中的,斷電即消失,所以若要保存其內容就必須點擊保存讓其存入硬盤中

python解釋器執行py文件的原理 :

第一階段:python解釋器啟動,此時就相當於啟動了一個文本編輯器

第二階段:python解釋器相當於文本編輯器,去打開test.py文件,從硬盤上將test.py的文件內容讀入到內存中(小複習:pyhon的解釋性,決定了解釋器只關心文件內容,不關心文件後綴名)

第三階段:python解釋器解釋執行剛剛加載到內存中test.py的代碼( ps:在該階段,即執行時,才會識別python的語法,執行文件內代碼,執行到name="jack",會開闢內存空間存放字符串"jack")

總結:python解釋器於文件本編輯的異同

相同點: python解釋器是解釋執行文件內容的,因而python解釋器具備讀py文件的功能,這一點與文本編輯器一樣

不同點 : 文本編輯器將文件內容讀入內存後,是為了顯示/編輯,而python解釋器將文件內容讀入內存後,是為了執行(執行前會識別python語法)

what's the 字符編碼?

字符編碼: 將人輸入的字符轉換成計算機能識別的二進制數字的過程的定義的標準就叫字符編碼。

字符=====(字符編碼)====>二進制數

由於計算機起源於美國,所以一開始設置的字符編碼只針對英文。最早的字符編碼叫 ASCII碼,後來為了滿足更多國家的文字的需求,又定製了其他的字符編碼。如中國的是 GBK ,日本的是shift_JIS,韓國是Euc_kr等等。

ASCII碼: 一個Bytes代表一個字符(英文字符/鍵盤上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個字符。( ASCII最初只用了後七位,127個數字,已經完全能夠代表鍵盤上所有的字符了(英文字符/鍵盤的所有其他字符)後來為了將拉丁文也編碼進了ASCII表,將最高位也佔用了)

GBK: 2Bytes代表一個字符(一箇中文)

因為每個國家有他們自己的標準,若同時使用多種語言時,標準不同會造成亂碼,這就需要設置一個通用的萬國標準,這就是Unicode和UTF-8

unicode: 統一用2Bytes代表一個字符;優點是字符->數字的轉換速度快,缺點是佔用空間大,因為英文只需1Bytes,而他統一使用2Bytes,就會造成資源浪費及佔用空間大

UTF-8: 對英文字符只用1Bytes表示,對中文字符用3Bytes;優點是節省空間,缺點是:字符->數字的轉換速度慢,因為每次都需要計算出字符需要多長的Bytes才能夠準確表示

注:存儲時,python2默認ASCII碼,python3默認UTF-8,可在文件開頭輸入#-*-coding:utf-8-*-,來指定解釋器用什麼字符編碼

規定:

  1. 內存中使用的編碼是unicode,用空間換時間(程序都需要加載到內存才能運行,因而內存應該是儘可能的保證快)

  2. 硬盤中或者網絡傳輸用utf-8,網絡I/O延遲或磁盤I/O延遲要遠大與utf-8的轉換延遲,而且I/O應該是儘可能地節省帶寬,保證數據傳輸的穩定性。

註解:所有程序,最終都要加載到內存,程序保存到硬盤中不同的國家使用的是不同的編碼格式,但是到內存中我們必須兼容萬國

重點!: 文件在內存中使用的是Unicode,若要保存到硬盤中就要經過encode存為UTF-8,硬盤中的文件是以UTF-8的形式存儲的,若要調用就必須經過decode成Unicode加載到內存中

什麼是字符編碼?神級程序員完全解剖分析!(原來如此)

注:在文件編輯器的右下角可以選擇字符編碼,一般情況下默認為UTF-8

亂碼 的產生有兩種情況:

一、一份文件包含有各國語言,若保存時用的是某個國家的標準而不是萬國標準的話,其他非本國的語言的文字就會以亂碼的形式被保存,以後再調用時一直為亂碼,等於文件被損壞,亂碼無法復原。

二、一份文件以自己國家的標準的形式保存,在調用時用了其他的標準時,因為無法加載就會產生亂碼,此時的亂碼通過變為原來的標準就可以恢復

結論:要避免亂碼的產生,最好的方法就是以什麼字符編碼保存就以什麼字符編碼打開

瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器

什麼是字符編碼?神級程序員完全解剖分析!(原來如此)

如果服務端encode的編碼格式是utf-8, 客戶端內存中收到的也是utf-8編碼的二進制。

what's the 文件處理

文件處理的流程為:

  1. 打開文件,得到文件句柄並賦值給一個變量

  2. 通過句柄對文件進行操作

  3. 關閉文件

文件打開模式: 文件句柄 = open('文件路徑', '模式')

注:打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。

open:

1 會向操作系統發起系統調用,操作會打開一個文件

打開文件的模式有:

  • r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】

  • w,只寫模式【不可讀;不存在則創建;存在則清空內容】

  • x, 只寫模式【不可讀;不存在則創建,存在則報錯】

  • a, 追加模式【可讀; 不存在則創建;存在則只追加內容】

"+" 表示可以同時讀寫某個文件

  • r+, 讀寫【可讀,可寫】

  • w+,寫讀【可讀,可寫】

  • x+ ,寫讀【可讀,可寫】

  • a+, 寫讀【可讀,可寫】

"b"表示以字節的方式操作

  • rb 或 r+b

  • wb 或 w+b

  • xb 或 w+b

  • ab 或 a+b

注:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼

flush原理:

1、文件操作是通過軟件將文件從硬盤讀到內存

2、寫入文件的操作也都是存入內存緩衝區buffer(內存速度快於硬盤,如果寫入文件的數據都從內存刷到硬盤,內存與硬盤的速度延遲會被無限放大,效率變低,所以要刷到硬盤的數據我們統一往內存的一小塊空間即buffer中放,一段時間後操作系統會將buffer中數據一次性刷到硬盤)

3、flush即強制將寫入的數據刷到硬盤

讀取的進度條,或者叫滾動條的代碼:

import timefor i in range(10):

文件內光標的移動:

一: read(3):

1. 文件打開方式為文本模式時,代表讀取3個字符

2. 文件打開方式為b模式時,代表讀取3個字節

二: 其餘的文件內光標移動都是以字節為單位如seek,tell,truncate

注意:

1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的

2. truncate是截斷文件,所以文件的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空文件了,所以truncate要在r+或a或a+等模式下測試效果

上下文管理(即創建一個新文件,在源文件中讀一行就在新文件中寫一行)

with open('a.txt','r') as read_f,open('b.txt','w') as write_f: data=read_f.read()

循環讀取每一行的內容:

with open('a.txt','r',encoding='utf-8') as f: while True:

文件的修改:

import os

相關推薦

推薦中...