字符編碼及文件操做

今日學習內容,字符編碼。python

首先複習一下運行文件的基本操做:windows

計算機的三個核心組件:CPU、內存、硬盤。網絡

任何一個程序要想運算,必選先有硬盤加載到內存,而後cpu去內存取指執行,運行着的應用程序產生的數據,必先存在內存。編輯器

而後是回顧了python解釋器運行一個py文件(如xxx.py)的步驟:學習

一、將python解釋器的代碼由硬盤讀到內存。編碼

二、將xxx.py以普通文本文件形式讀到內存。spa

三、python讀取文件內容,識別python語法,執行相應的操做。操作系統

(普通的文本編輯器與python解釋器的前兩步是同樣的)code

字符編碼

今天學習的新內容是字符編碼,字符編碼針對文字,字符編碼只跟文本文件有關。blog

人在操做計算機的時候輸入的是人可以看懂的字符,可是計算機只能識別0101010這樣的二進制數據。輸入的流程是輸入字符>>>字符編碼表(字符編碼表就是字符與數字的對應關係)>>>二進制數字。

字符編碼的發展史以及分類

第一個階段

計算機由美國人發明,因此最先的字符編碼爲ASCII。

第二個階段

中國規定的GBK編碼。

日本人規定的Shift_JIS編碼。

韓國人規定的Euc-kr編碼。

第三個階段

unicode萬國碼(能包括全世界的語言)。

爲了能夠節省unicode耗費空間的UTF-8編碼。

結果:內存中統一採用unicode,浪費空間換區能夠轉換成任意編碼(亂碼),硬盤採用utf-8,保證存放於硬盤或者基於網絡傳輸的數據量很小,提升傳輸效率與穩定性。

unicode的兩個特色
1.用戶在輸入的時候,不管輸什麼字符都可以兼容萬國字符
2.其餘國家編碼的數據由硬盤讀到內存的時候unicode與其餘各個國家的編碼都有對應關係

存取過程當中的數據變換:

數據由內存保存到硬盤
1.內存中的unicode格式二進制數字 >>>>編碼(encode)>>>>> utf-8格式的二進制數據
硬盤中的數據由硬盤讀到內存
1.硬盤中的utf-8格式的二進制數據 >>>>>解碼(decode)>>>>> 內存中unicode格式的二進制數據

亂碼:字符不可以正常顯示 (編碼不一致)

保證不亂嗎的關鍵在於文本文件以什麼編碼就用什麼解碼。

python2
將py文件按照文本文件讀入解釋器中默認使用ASCII碼(由於在開發python2解釋器的unicode尚未盛行)
python3
將py文件按照文本文件讀入解釋器中默認使用utf-8

 

基於Python解釋器開發的軟件,只要是中文,前面都須要加一個u
在python2中,當你不指定文件頭的時候,默認用ASCII存儲數據,若是指定文件頭那麼就按照文件頭的編碼格式存儲數據。python3中字符串默認就是unicode編碼格式的二進制數。

補充點:1.pycharm終端用的是utf-8格式。2.windows終端採用的是gbk。

x = ''
res1 = x.encode('gbk')  # 將unicode編碼成能夠存儲和傳輸的utf-8的二進制數據
print(res1)  # b'\xe4\xb8\x8a'
# bytes類型  字節串類型  你就把它當成二進制數據便可
res2 = res1.decode('gbk')  # 將硬盤中的utf-8格式的二進制數據解碼成unicode格式的二進制數據
print(res2)
 你a他
1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes  
1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit  # 每一個Bytes真正的有效位數是7位,而首位是一個標誌位。

文件處理

什麼是文件?操做系統提供給用戶操做複雜硬件(硬盤)的簡易接口。

爲何要操做文件?人或者應用程序須要永久的保存數據。

怎麼使用?

#1. 向操做系統發送請求,打開某個文件(應用程序要想操做計算機硬件 必須經過操做系統來簡介的操做)
f=open('a.txt','r',encoding='utf-8') #默認打開模式就爲r
#2. 向操做系統發請求 讀取文件內容
f.read()
#3. 告訴操做系統 關閉打開的文件
f.close()

with open

with open(r'D:\Python項目\day07\a.txt',encoding='utf-8') as f ,\

能夠自動幫你調用f.close()

文件打開的模式

 r   只讀模式

 w   只寫模式   

 a   追加寫模式

print(f.readable())  # 是否可讀
print(f.writable())  # 是否可寫
print(f.read())  # 一次性將文件內容所有讀出

補充:文件路徑能夠寫相對路徑,可是須要注意該文件必須與執行文件在同一層文件下。

r模式在打開文件的時候,若是文件不存在,則直接報錯

with open(r'a.txt',mode='r',encoding='utf-8') as f:  mode關鍵字能夠不寫
print(">>>1:")
print(f.read())  # 一次性將文件內容所有讀出
print('>>>2:')
print(f.read())  # 讀完一次以後 文件的光標已經在文件末尾了,再讀就沒有內容了可讀
print(f.readlines())  # 返回的是一個列表  列表中的一個個元素對應的就是文件的一行行內容,內部至關於一個for循環。
print(f.readline())  # 只讀取文件一行內容
   

w模式須要慎用

一、文件不存在的狀況下,自動建立該文件。

二、文件存在的狀況下,先清除文件內容,再寫入。

with open(r'xxx.txt',mode='w',encoding='utf-8') as f:  # 當文件xxx.txt不存在時,會生成一個該文件。
   print(f.readable())  # 是否可讀
   print(f.writable())  # 是否可寫
   f.write('不不不,你沒有翻~\n')  # write是用來寫入內容的,\n是用來換行的。
   l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你沒sa翻~\n']
   f.writelines(l)  # writeliens的做用是,寫入列表l中的全部內容,內部原理也是一個for循環

a模式

1.當文件不存在的狀況下 自動建立該文件

2.當文件存在的狀況下,不清空文件內容, 文件的光標會移動文件的最後

with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
    f.write('我是小尾巴\n')

操做文件單位的方式
t 文本文件 t在使用的時候須要指定encoding參數 若是不知道默認是操做系統的默認編碼
b 二進制 必定不能指定encoding參數

相關文章
相關標籤/搜索