1. 程式人生 > >python基礎之字符編碼及文件操作

python基礎之字符編碼及文件操作

運行原理 讀文件 進制數 包括 當前 告訴 行程 列表 多個

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

1、計算機運行程序或讀取文件的原理

為了使計算機運行速度不被I/O操作速度拖慢,CPU並不會直接從硬盤中讀取數據,因為硬盤的讀寫速度和CPU相差太大,所以CPU都是從速度相對較快的內存中讀取數據的。而程序文件和文本文件為了永久保存又都保存在硬盤中,因此計算機運行程序或讀取文件的過程一般是這樣的,先由操作系統控制硬盤將程序文件或文本文件讀取到內存中,然後CPU再從內存中讀取數據運行或者輸出到終端打印到屏幕上。

2、文本編輯器讀取文件原理

2.1文本編輯器程序文件讀取到內存中運行

2.2 將文本文件讀取到文本編輯器所在內存空間

2.3 文本編輯器將讀取到內存中的文本文件內容打印到終端

3、python解釋器運行原理

3.1 python解釋器程序文件讀取到內存中運行

3.2 python程序文件讀取到python解釋器所在內存空間

3.3 python解釋器解釋執行python程序文件中的代碼

所以文本編輯器和python解釋器在讀取python程序文件時的過程是一樣的,而python程序文件在沒有被執行之前和普通文本文件也沒有區別,不一樣的是文本編輯器讀取python程序文件是為了打印到終端顯示,python解釋器則是為了解釋執行python代碼,也是在這一步python程序文件中的內容才有了代碼的意義。

二、什麽是字符編碼

文件中的那些字符是人能識別的,計算機只能識別二進制數,那如何讓文件中那些人能識別的字符可以被計算機識別呢,即如何把字符轉換為二進制數,這就用到了字符編碼。字符編碼就是把字符對應到一個特定的數字上,有了字符編碼這種字符到數字的對應關系之後,只需要再把這些數字轉換成二進制數就可以讓計算機識別那些人才能識別的字符啦。

而計算機中能用到字符編碼的場景只有以下兩種:

1、文本文件包括程序代碼文件被存取的時候

2、程序文件中的字符串被定義和使用時

三、Unicode和UTF-8

字符編碼在最開始的時候只有ASCII碼,專門用於識別英文字母和一些特殊符號,用1Bytes代表一個字符,之後計算機普及了各國都有了自己的字符編碼,為了給字符編碼一個統一標準以便各國的程序互相可以正常運行就出現了Unicode萬國碼,它兼容所有國家的語言,Unicode規定所有語言都用2Bytes代表一個字符。然而這就是存儲英文文件的空間無故多了一倍,所以為了節省這部分空間就出現了UTF-8,它規定存儲英文用1Bytes代表一個字符,其余都用3Bytes代表一個字符。

Unicode因為簡單粗暴的規定所有國家的語言都用2Bytes代表一個字符,沒有判斷英文字符的時間,所以轉換速度更快,在內存中同一使用Unicode編碼格式存儲字符

UTF-8因為在存儲英文上更節省空間,並且用於判斷英文字符的時間遠小於硬盤I/O速度和網絡延遲,所以在硬盤存儲和網絡傳輸中都使用的是UTF-8編碼格式

四、字符編碼間的轉換

4.1、轉換關系

Unicode-------》encode------》其他編碼格式

其他編碼格式-----》decode--------》Unicode

1)encode、decode必須使用相同的字符編碼,否則就會亂碼

2)在encode和decode時需要說明編碼和解碼的字符編碼,這裏說的字符編碼指的是文件使用的編碼格式

4.2、默認編碼

python3中默認文件存取的字符編碼是UTF-8,默認的字符串編碼格式為Unicode

python2中默認文件存取的字符編碼是ASCII,默認的字符串編碼也是ASCII並且存儲形式是encode後的bytes類型,可以在字符串前加u使編碼格式變為Unicode,比如u‘你好啊‘

Windows系統的默認字符編碼為gbk

4.3、亂碼

因為文件在內存和硬盤間有存取兩種操作方式,所以亂碼的產生也有兩種情景

1)亂碼產生於文件保存時

由於在文件保存時使用了不合適的字符編碼格式導致文件無法正確保存,導致文件亂碼,這種亂碼實際上文件已經損壞。比如文件內容都是中文,但保存時使用了日文的字符編碼就會造成這一種情況。

2)亂碼產生於文件讀取時

由於讀取文件時使用了和文件保存時不一樣的字符編碼,使文件無法正常顯示,這種亂碼是可以解決的,只需要使用正確的字符編碼即可。

4.4、python指定程序執行使用的編碼格式

我們在保存python文件時可能使用其他編碼格式,為了不讓解釋器使用默認編碼格式運行程序導致報錯,就需要提前告訴解釋器應該使用何種編碼格式運行自己的程序,方法很簡單就是在代碼的第一行寫上#coding:文件編碼格式

4.5、程序執行時的字符編碼問題

由於內存中同一使用Unicode,所以所有文件在讀入內存時都是Unicode編碼格式,而在程序遇到字符串定義時會在內存中再開辟內存去存放字符串一般這時候還是以Unicode編碼格式存放,但也可以指定其他格式

4.6、python2和python3的區別

python2中字符串有兩種定義格式,1 name=‘alex‘,這種格式定義的字符串在內存中存儲時是以encode後的bytes類型存在內存中的,因為在python2中定義bytes=str,而encode時的字符編碼就是文件頭指定的編碼格式或者不指定就是 python2默認的ASCII;2 name=u‘alex‘,這種格式定義的字符串在內存中就是以Unicode編碼格式存放的

python3中也有兩種字符串定義格式,1name=‘alex‘,這種格式定義的字符串在python3中直接就是Unicode編碼格式存放的;2 s=‘alex‘,s1=s.encode(‘utf-8‘),s1就是python3中的bytes類型數據了

五、字符編碼的結論

1、encode用什麽編碼,decode就用什麽解碼

2、bytes類型是Unicode編碼後的數據,bytes類型想看到信息就要decode成Unicode

3、在硬盤存儲數據和網絡傳輸中必須是bytes類型的數據

六、文件操作

1)打開文件

python中打開文件使用open函數,比如open(r‘文件路徑‘,‘打開文件的模式‘,encodig=‘文件使用的字符編碼‘)。open函數中的三個參數分別為:

文件路徑:指定需要操作的文件的路徑,一般在文件路徑前加r,使一些特殊的符號比如\t,\n等變成普通字符

文件打開模式:常用的模式有r只讀模式,文件只能查看內容不能往裏面添加內容,文件打開後光標在文件開頭;w只寫模式,文件只能往裏面添加內容不能查看,且會清空文件原本的內容,文件打開後光標在文件開頭;a追加模式,只能在文件末尾追加內容,不能查看,文件打開後光標在文件末尾;rb、wb、ab在前面三種模式基礎上加上b表示文件以二進制形式被操作,不需要考慮編碼格式,適用於任何文件。如果不指定文件打開模式,默認以只讀模式打開。

文件使用的字符編碼:打開文件時說明文件保存時使用的是何種字符編碼,不指定則默認為utf-8

文件打開後會獲得一個文件句柄,需要將它賦值給一個變量以便後續對文件進行操作。

2)讀文件

f.read():將文件的全部內容以一個字符串形式返回,也可以指定讀取文件的長度如,f.read(3)表示讀取文件中從開頭位置到第三個字符處的內容

f.readline:每次調用只讀取文件的一行內容,以字符串形式返回

f.readlines:將文件的全部內容以一個列表的形式返回,文件的每一行內容作為列表的一個元素,並且為字符串形式

for循環輸出文件內容:

for line in f:

print(line)

以上是讀取文件最快的方式,因為在內存中同時只會有文件的一行內容

3)寫文件

f.write:向文件中寫入一行數據

f.writelines:向文件中寫入多行數據,以列表的形式傳入如,f.writelines([‘1111‘,‘aaaa‘,‘dddd‘])表示寫入三行數據分別為‘1111’,‘aaaa’,‘dddd‘

4)關閉文件

f.close:向操作系統發起關閉文件的請求,此時f的文件句柄還在但是已經無法操作文件

5)文件的其他操作

1、上下文管理

python中為了防止程序員忘記關閉文件提供了一種便捷的函數即with函數,它可以在文件操作完之後自動關閉文件,並且在打開文件時可以同時打開多個文件,比如with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f,\

open(‘a.txt.swap‘,‘r‘) as write_f:

2、光標移動

seek:將光標移動到指定位置,比如f.seek(0)表示將光標移動到文件開頭位置

tell:返回光標當前所處位置

truncate:截斷文件,除了指定位置的內容其余都清除,比如f.truncate(3)表示保留文件開頭到第三個字符處的內容,其余都被清除

3、強制將內存的數據寫入硬盤

f.flush:強制將內存中的數據立即寫入硬盤而不等待系統寫入

4、文件修改

python中要修改一個文件的內容一般都是打開源文件,再打開一個空白文件,一邊從源文件讀一邊寫入空白文件然後把需要修改的行修改之後寫入空白文件,最後把源文件刪除再把新建的文件重命名為之前的文件名。

python基礎之字符編碼及文件操作