06 Python字符編碼與文件處理
python垃圾回收機制:
python中的垃圾回收機制是以引用計數為主,分代收集為輔,引用計數的缺陷是循環引用的問題,一個對象的引用數為0 ,那麽這個對象就會被python虛擬機回收內存
字符編碼
字符編碼的介紹
計算機存放的都是二級制數字,我們輸入一個字符,計算機是不認識的,那麽就需要一個編碼表,吧我們寫入的字符轉換為二級制數,然後將輸入字符對應的二進制數寫入內存,再由內存寫入硬盤
在這之間只有一種編碼表
ASCII:只能表示英文字符,用1Bytes對應一個英文字符
內存:ASCII
硬盤:ASCII
GBK:可以表示中文字符和英文字符,用1Bytes表示一個英文字符,用2Bytes表示一個中文字符
內存:GBK
硬盤:GBK
Shift-JIS:
內存:Shift-JIS
硬盤:Shift-JIS
Euc-kr:
內存:Euc-kr
硬盤:Euc-kr
以上是各個國家的字符編碼,但是這種字符編碼只能在自己的國家使用,所以之後出現了一種統一的字符編碼
unicode:可以對應萬國字符,統一用2個Bytes表示一個字符
兩大特點:
1:可以兼容萬國字符
2 與萬國字符都有一種數字與數字的對應關系
人們寫入的字符先轉碼為unicode編碼寫進內存,再有硬盤裏的GBK、EUC-kr或Shift-JIS編碼表進行編碼之後寫進硬盤
如果要使用,就將字符經過解碼,轉變為unicode編碼,寫進內存後再通過unicode編碼表一一對應。
GBK數字-----解碼decode----->unicode數字 Shift-JIS數字-----解碼decode----->unicode數字 GBK數字<-----編碼encode-----unicode數字 UTF-8數字<-----編碼encode-----unicode數字
不同的字符編碼轉換為英文和中文對應的字節數如下
字符編碼 英文 中文
ASCII 1Bytes 無
GBK 1Bytes 2Bytes
Unicode 2Bytes 2Bytes
Utf-8 1Bytes 3Bytes
保證不亂碼的關鍵
當初用什麽字符編碼存的,取的時候就用什麽編碼解碼
強調:此時計算機只能使用unicode與字符的對應關系
在pytohn2中
1 (執行python程序的第二個階段)解釋器在將py文件當普通的文本文件讀入內存時默認使用的編碼是ASCII
2 有兩種字符串類型:
str:x="上" # 文件頭指定的編碼格式的二進制
unicode:x=u"上" # 存成unicode格式的二進制
ps:pyhon2中unicode就是python3的str類型
在python3中:
1 (執行python程序的第二個階段)解釋器在將test.py當普通的文本文件讀入內存時默認使用的編碼是UTF-8
2 (執行python程序的第三個階段,開始識別語法),會字符類型的值開辟一個內存空間存入unicode格式的二進制
ps:python3中的str類型是unicode編碼的二進制
3 字符串類型
str: x="上" 把‘上’ 存成unicode格式的二進制
字節串=x.encode(‘utf-8‘)
文件頭:
在文件首行寫上:coding:utf-8
就是在告訴python解釋器,不要用其默認的編碼,用文件頭指定的編碼
文件處理
1 什麽是文件:
文件就是操作系統為用戶/操作系統提供的操作硬盤的抽象單位
2 為什麽要用文件
實現將內存中的數據永久保存到硬盤中
3 如何用文件
文件操作的基本步驟
f=open(r‘a.txt‘,encoding=‘utf-8‘) #打開文件,拿到一個文件對象f,f就相當於一個遙控器,可以向操作系統發送指令 f.read() # 讀寫文件,向操作系統發送讀寫文件指令 f.close() # 關閉文件,回收操作系統的資源
強調:一定要在程序結束前關閉打開的文件
上下文管理:
with open(‘文件路徑‘,mode=‘打開模式‘,encoding=‘編碼表‘) as f: pass
with結束後會自動關閉文件
4 文件的打開模式
r:只讀模式
w:只寫模式
a:只追加模式
5 控制讀寫文件單位的方式(必須與r/w/a連用)
t:文本模式(默認的),一定要指定encoding參數
優點;操作系統會將硬盤中的二進制數字解碼城unicode然後返回
強調::只針對文本文件才會有效
whit open(‘a.txt‘,mode=‘rt‘,encoding = ‘utf-8‘ ) as f: data = f.read() print(data,type(data)) with open(‘f.png‘,‘mode=‘‘rt,encoding = ‘utf-8‘)as f: data = f.read()
二進制模式,一定不能制定encoding參數
with open(‘q.png‘,‘rb‘)as f: data = f.read() print(data,type(data)) with open(‘a.txt‘,mode = ‘rb‘) as f: data = f.read() print(data,type(data)) print(data.decode(‘utf-8‘))
r: 只讀模式L(默認的)
1當文件不存在是,會報錯
2 當文件存在時,文件指針指向文件的開頭
with open(‘a.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f: res1=f.read() print(‘111===>‘,res1) res2=f.read() print(‘222===>‘,res2) with open(‘a.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f: print(f.read()) print(f.readable()) print(f.writable()) print(f.readline()) print(f.readline()) with open(‘a.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f: for line in f: print(line) with open(‘a.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f: l=[] for line in f: l.append(line) print(l) print(f.readlines()
w: 只寫模式
1 當文件不存在時,新建一個空文檔
2 當文件存在時,清空文件內容,文件指針跑到文件的開頭
with open(‘c.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f: print(f.readable()) print(f.writable()) print(f.read()) f.write(‘哈哈哈\n‘) f.write(‘你愁啥\n‘) f.write(‘瞅你咋地\n‘) f.write(‘1111\n2222\n333\n4444\n‘) info=[‘egon:123\n‘,‘alex:456\n‘,‘lxx:lxx123\n‘] for line in info: f.write(line) f.writelines(info) with open(‘c.txt‘,mode=‘rb‘) as f: print(f.read()) with open(‘c.txt‘,mode=‘wb‘) as f: f.write(‘哈哈哈\n‘.encode(‘utf-8‘)) f.write(‘你愁啥\n‘.encode(‘utf-8‘)) f.write(‘瞅你咋地\n‘.encode(‘utf-8‘))
a: 只追加寫模式
1 當文件不存時,新建一個空文檔,文件指針跑到文件的末尾
2 當文件存在時,文件指針跑到文件的末尾
with open(‘c.txt‘,mode=‘at‘,encoding=‘utf-8‘) as f: print(f.readable()) print(f.writable()) f.write(‘虎老師:123\n‘)
在文件打開不關閉的情況下,連續的寫入,下一次寫入一定是基於上一次寫入指針的位置而繼續的
with open(‘d.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f: f.write(‘虎老師1:123\n‘) f.write(‘虎老師2:123\n‘) f.write(‘虎老師3:123\n‘) with open(‘d.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f: f.write(‘虎老師4:123\n‘) with open(‘d.txt‘,mode=‘at‘,encoding=‘utf-8‘) as f: f.write(‘虎老師1:123\n‘) f.write(‘虎老師2:123\n‘) f.write(‘虎老師3:123\n‘) with open(‘d.txt‘,mode=‘at‘,encoding=‘utf-8‘) as f: f.write(‘虎老師4:123\n‘)
06 Python字符編碼與文件處理