今日學習內容,字符編碼。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(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()) # 一次性將文件內容所有讀出
補充:文件路徑能夠寫相對路徑,可是須要注意該文件必須與執行文件在同一層文件下。
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()) # 只讀取文件一行內容
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循環
with open(r'yyy.txt',mode='a',encoding='utf-8') as f: f.write('我是小尾巴\n')
操做文件單位的方式
t 文本文件 t在使用的時候須要指定encoding參數 若是不知道默認是操做系統的默認編碼
b 二進制 必定不能指定encoding參數