day 0308 編碼的進階 檔案操作
一.編碼的進階:
在python3以後,字串和bytes型別徹底分開,字串以字元為單位進行處理的,bytes型別是以位元組為單位處理的。
bytes資料型別在所有的操作和使用與字串方法基本一樣,也是不可變的序列物件。
b=b''#建立一個空的bytes c=bytes()#建立一個空的bytes print(b) print(c) #這兩個是建立空bytes的表示
s1='alex' print(s1,type(s1))#建立一個字元為alex的變數s1,並列印 s2=b'alex' print(s2.upper())#將字串變成大寫下的bytes型別 print(s2,type(s2))#s2de bytes型別 結果: alex <class 'str'> b'ALEX' b'alex' <class 'bytes'>
s1='中國' print(s1,type(s1))#列印中文下的字串型別 bytes型別不顯示中文,這是與str的區別。 s2=s1.encode('utf-8')#將s1以utf-8編碼 print(b1,type(b1)) 結果: 中國 <class 'str'> b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'> #這裡中國是兩個字元 在utf-8編碼下是一個字元三個位元組 、\xe4是一個位元組。
1.將字串str 轉化為utf-8下的bytes
s1='a太白' b1=s1.encode('utf-8')#將字串轉化utf-8的bytes print(b1) 結果:b'a\xe5\xa4\xaa\xe7\x99\xbd'#在utf-8下字串一個字元佔三個位元組,字母佔用一個位元組
2.將字串str 轉化為 gbk下的bytes。
s1 = 'a太白' b1 = s1.encode('gbk')#將字串轉化成gbk模式下的bytes。encode編碼,decode解碼 print(b1) 結果:b'a\xcc\xab\xb0\xd7'#在gbk下一個中文字元佔用兩個位元組,字母佔用一個位元組
3.在utf-8編碼下的bytes 轉化成字串str (unicode)
b3 = b'a\xe5\xa4\xaa\xe7\x99\xbd' s1=b3.decode('utf-8')#解碼在utf-8模式下轉化 print(s1) 結果: a太白
4.終極轉化:在utf-8編碼下的bytes 轉化成 gbk編碼下的bytes。
b3 = b'a\xe5\xa4\xaa\xe7\x99\xbd'#utf-8下的bytes #將b3轉化成unicode解碼 s = b3.decode('utf-8') #再將s編碼成gbk b4=s.encode('gbk') print('b4') utf-8 bytes————》unicode————》gbk bytes
注意:由於utf-8和gbk編碼下的英文都是對映於ASCII,所以直接轉化。
s1='alex!123’ b1=s1.encode('utf-8')#編碼成utf-8 bytes s2=b1.decode('gbk')#將utf-8 bytes直接轉化成 gbk bytes print(s2) 結果: alex!12
二.檔案操作的初始:
f=open('F:\ pence.txt',encoding='utf-8',mode='r') print(f.read()) f.close()
這裡,f變數:f, f1, file, file_handler, ....檔案控制代碼。
open()—— python的內建函式,python提供的一個功能。
底層呼叫的是作業系統的呼叫檔案命令,藉口。
Windows:編碼gbk
linux,ms:編碼utf-8
操作檔案的流程:
1.開啟檔案,產生一個檔案控制代碼。
2.開啟檔案控制代碼進行檔案操作。
3.關閉檔案控制代碼
三. 檔案的讀
1.read()用法:
# read ()全部讀取 #1. 開啟檔案,得到檔案控制代碼並賦值給一個變數 f1=open('r模式',encoding='utf-8') #預設是‘r'’模式下省略不寫 #或者寫成f1=open('r模式',encoding='utf-8',‘r’) #這時已經建立一個檔案r模式,並以utf-8編碼 #2. 通過控制代碼對檔案進行操作 content=f1.read() print(content,type(content)) #3. 關閉檔案 f1.close() #其中del f一定要發生在f.close()之後,否則就會導致作業系統開啟的檔案還沒有關閉,白白佔用資源, 而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢檔案後,一定要記住f.close()
2.read(n) 用法:
r模式下:n 字元
rb模式下:n 位元組
f1 = open('r模式',encoding='utf-8') print(f1.read(3))#讀取文字內的三個字元 f1.close() f1 = open('r模式',mode='rb') #預設是在utf-8編碼 f2=f1.read(3).decode('utf-8') #讀取三個位元組並在以utf-8編碼(三個位元組對應一個字元) print(f2) f1.close() f1 = open('r模式',mode='rb') print(f1.read(3)) #rb模式下 沒有轉碼直接顯示bytes型別 f1.close()
3.readline()按照行讀取資料:
f1 = open('r模式',encoding='utf-8') print(f1.readline().strip()) #讀取第一行 print(f1.readline().strip()) #讀取第二行 print(f1.readline().strip()) #讀取第三行 f1.close() 結果: 你擦粉回覆 理論在茶几上的 djadhajk 迫在眉睫
4. readlines()讀取檔案所有行數
返回一個list,列表的每個元素是原始檔的每一行
f1 = open('r模式',encoding='utf-8') print(f1.readlines()) f1.close() 結果: ['你擦粉回覆 理論在茶几上的\n', 'djadhajk\n', '迫在眉睫\n', '轟轟烈烈']
5.迴圈讀取:
f1=open('r模式',encoding='utf-8') for line in f1: print(line) f1.close()
6. r b 以位元組的形式讀取,帶b的一般操作的都是 非文字類的檔案.
f1 = open('美女.jpg',mode='rb') #美女.jpg -非文字類檔案,mode='rb'以位元組形式讀取 print(f1.read()) #返回值是位元組 f1.close() 結果: b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xfe\x00;CREATOR: gd-jpeg v1.0 (using IJG。。。。。。。。。。
# f1 = open('r模式',mode='rb') # print(f1.read())
# f1.close()
7.r + 讀寫模式:
先讀後寫
f1 = open('r模式',encoding='utf-8',mode='r+') content = f1.read() print(content) f1.write('666') f1.close() #先讀後寫,666新增到檔案最後
先寫後讀:
f1 = open('r模式',encoding='utf-8',mode='r+') f1.write('666') print(f1.read()) f1.close() # 先寫後讀,先把666覆蓋檔案內容的最前面
#先寫入檔案,當寫入檔案操作完成時,游標已經處於末尾處,當繼續讀取操作時,游標向後讀取,所以內容為空。
四.檔案的寫:
w w+ wb w+b
# 沒有檔案,建立檔案,寫入內容 f = open('w.bak模式',encoding='utf-8',mode='w') f.write('隨便寫一點') f.close() 結果:在檔案多了一個w.bak模式檔案。檔案內的內容是便寫一點
# 如果有檔案,先清空內容,後寫入 f = open('w模式',encoding='utf-8',mode='w') for i in range(4): f.write('Alex is a lower man\n') f.close() #w模式檔案是用資料的,執行後檔案內容清空後新增四行Alex is a lower man
wb(以二進位制寫入,跟r b模式一樣。非文字類的檔案)
f1 = open('美女.jpg',mode='rb') content = f1.read() f2 = open('美女3.jpg',mode='wb') f2.write(content) f2.close() #相當於複製美女.jpg 。複製出一個新檔案 美女3.jpg(新生成的檔案之前沒有)
五.檔案的追加:
a , a+ , ab, a+b
# a沒有檔案 建立檔案,寫入內容 f = open('b模式',encoding='utf-8',mode='a') f.write('很多讓人很有成就感的事情') f.write('很多讓人很有成就感的事情') f.write('很多讓人很有成就感的事情') f.close() #在檔案中建立檔名:b模式,該檔案內寫入一行三次'很多讓人很有成就感的事情'
#a如果存在該檔案,直接在內容後直接新增資訊 f = open('a模式',encoding='utf-8',mode='a') f.write('666') f.close() # a模式內容後面新增666
六.檔案的改
步驟:1,以讀的模式開啟原檔案.
2.以寫的模式建立一個新檔案
3.將原檔案內容讀取出來,按照你的要求改成新內容,寫入新檔案。
4.刪除原檔案
5.將新檔案重新命名成原檔案
# 1,以讀的模式開啟原檔案. # 2,以寫的模式建立一個新檔案. # import os # with open('alex自述',encoding='utf-8') as f1,\ #open('alex自述.bak',encoding='utf-8',mode='w') as f2: # # 3,將原檔案內容讀取出來,按照你的要求改成新內容,寫入新檔案. #old_content = f1.read() #new_content = old_content.replace('alex','sb') #f2.write(new_content) # # 4,刪除原檔案. # os.remove('alex自述') # # 5,將新檔案重新命名成原檔案. # os.rename('alex自述.bak','alex自述')
# import os # with open('alex自述',encoding='utf-8') as f1,\ #open('alex自述.bak',encoding='utf-8',mode='w') as f2: # # 3,將原檔案內容讀取出來,按照你的要求改成新內容,寫入新檔案. #for old_line in f1: #new_line = old_line.replace('alex','sb') #f2.write(new_line) # # # 4,刪除原檔案. # os.remove('alex自述') # # 5,將新檔案重新命名成原檔案. # os.rename('alex自述.bak','alex自述')