java8之一文徹底弄懂lambda表示式
阿新 • • 發佈:2020-09-14
1、檔案操作的流程:
1.1 檔案的定義:
檔案就是作業系統提供給應用程式來操作硬碟的介面,使用者或應用程式對檔案的操作,就是向作業系統發起呼叫,然後由作業系統完成對硬碟的具體操作。
1.2 操作檔案的基本流程:
1. 開啟檔案,由應用程式向作業系統發起系統呼叫open(...),作業系統開啟該檔案,對應一塊硬碟空間,並返回一個檔案物件賦值給一個變數f #open('檔案的路徑',mode = "開啟檔案的模式",encoding ="操作檔案的字元編碼") #預設開啟檔案的模式是rt模式,r代表只讀,t代表文字檔案,預設的開啟檔案的編碼是: win:gbk linux:utf-8 mac: utf-8f = open('a.txt',mode='r',encoding='utf-8') #預設開啟模式就為r 2. 呼叫檔案物件下的讀/寫方法,會被作業系統轉換為讀/寫硬碟的操作 data = f.read() 3. 向作業系統發起關閉檔案的請求,回收系統資源 f.close()
2、相對路徑和絕對路徑:
相對路徑:a.txt必須與當前py檔案在同一級目錄(一般使用相對路徑)
絕對路徑: 要找到根目錄的路徑
3、資源回收 與 with上下文管理
開啟一個檔案包含兩部分資源:應用程式的變數f和作業系統開啟的檔案。在操作完畢一個檔案時,必須把與該檔案的這兩部分資源全部回收,回收方法為
1、f.close() #回收作業系統開啟的檔案資源 2、del f #回收應用程式級的變數
其中 del f一定要發生在f.close()之後,否則就會導致作業系統開啟的檔案無法關閉,白白佔用資源,而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢檔案後,一定要記住f.close()。
with 可以自動幫你回收作業系統的資源,無需自己操作
with open('a.txt',mode='r',encoding='utf-8') as f: 可用with同時開啟多個檔案,用逗號分隔開即可 with open('a.txt','r') as f1,open('b.txt','r') as f2:
4、開啟檔案的三種模式:
r:只讀 注意:當要開啟的檔案不存在時,會報錯 with open('a.txt',mode='r',encoding='utf-8') as f: #with 可以不用關心關檔案了 print(f.read()) #讀取檔案,一次性讀出所有資料 print(f.readline()) #一行行讀,執行一次,列印一行內容 print(f.readlines()) #返回成列表的形式 print(f.readable()) #判斷檔案是否可讀 with open('a.txt',mode='r',encoding='utf-8') as f: for line in f: print(line,end="") #文字檔案裡本身就有隱藏的換行符,而print又自帶就有一個換行符,所以每行之間有空行
w:只寫 如果檔案不存在,則新建一個檔案,如果檔案記憶體在資料,會清空資料,重新寫入 f = open('a'.txt,mode='w',encoding='utf-8') print(f.write()) print(f.writable()) #判斷檔案是否可寫 print(f.writelines()) #for+f.write()
a:追加寫 如果檔案記憶體在資料,會在已有資料後面追加資料,如果檔案不存在,會新建一個檔案寫 f = open('a'.txt,mode='a',encoding='utf-8') print(f.write())
5、處理檔案的模式
大前提: t、b模式均不能單獨使用,必須與r/w/a之一結合使用
t(預設的):文字模式 1. 讀寫檔案都是以字串為單位的 2. 只能針對文字檔案 3. 必須指定encoding引數 b:二進位制模式: 1.讀寫檔案都是以bytes/二進位制為單位的 2. 可以針對所有檔案 3. 一定不能指定encoding引數 強調:b模式對比t模式 1、在操作純文字檔案方面t模式幫我們省去了編碼與解碼的環節,b模式則需要手動編碼與解碼,所以此時t模式更為方便 2、針對非文字檔案(如圖片、視訊、音訊等)只能使用b模式 注意:1.rb模式讀文字檔案需要解碼 with open('b.txt',mode='rb') as f: data=f.read() print(data.decode('utf-8')) 2.wb模式寫文字檔案需要編碼 with open('b.txt',mode='wb') as f: data='111' f.write(data.encode('utf-8'))
6、控制檔案內游標的移動
大前提:檔案內指標的移動都是Bytes為單位的,唯一例外的是t模式下的read(n),n以字元為單位(f.writes()照樣是按照bytes來算!)
with open('a.txt',mode='rt',encoding='utf-8') as f: data=f.read(3) # 讀取3個字元 with open('b.txt', mode='rb') as f: print(f.read(3)) # 讀取3個Bytes f.seek (offset,whence) offset:相對偏移度(游標移動的位數) whence:指定游標位置從何開始 0:從檔案開頭 1:從當前位置 2:從檔案末尾 強調:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用 如: a.txt用utf-8編碼,內容如下(abc各佔1個位元組,中文“你好”各佔3個位元組) abc你好 # 0模式的使用 with open('a.txt',mode='rt',encoding='utf-8') as f: f.seek(3,0) # 參照檔案開頭移動了3個位元組 print(f.tell()) # 檢視當前檔案指標距離檔案開頭的位置,輸出結果為3 print(f.read()) # 從第3個位元組的位置讀到檔案末尾,輸出結果為:你好 # 注意:由於在t模式下,會將讀取的內容自動解碼,所以必須保證讀取的內容是一個完整中文資料,否則解碼失敗 with open('a.txt',mode='rb') as f: f.seek(6,0) print(f.read().decode('utf-8')) #輸出結果為: 好 # 1模式的使用: with open('b.txt',mode='rb') as f: f.seek(3,1) # 從當前位置往後移動3個位元組,而此時的當前位置就是檔案開頭 print(f.tell()) # 輸出結果為:3 f.seek(4,1) # 從當前位置往後移動4個位元組,而此時的當前位置為3 print(f.tell()) # 輸出結果為:7 # 2模式的使用 with open('a.txt',mode='rb') as f: f.seek(0,2) # 參照檔案末尾移動0個位元組, 即直接跳到檔案末尾 print(f.tell()) # 輸出結果為:9 f.seek(-3,2) # 參照檔案末尾往前移動了3個位元組 print(f.read().decode('utf-8')) # 輸出結果為:好
6、檔案的修改
強調:
1、硬碟空間是無法修改的,硬碟中資料的更新都是用新內容覆蓋舊內容
2、記憶體中的資料是可以修改的
檔案a.txt原內容: 你好我是你爸爸 with open('a.txt',mode='r+t',encoding='utf-8') as f: f.seek(3) f.write('嗡嗡嗡') 檔案a.txt修改後內容: 你嗡嗡嗡你爸爸
6.1 檔案修改方式一:
實現思路:
1、將檔案內容發一次性全部讀入記憶體
2、在記憶體中修改完畢
3、再把修改後的結果覆蓋寫回原檔案
優點: 在檔案修改過程中同一份資料只有一份
缺點: 會過多地佔用記憶體
with open('db.txt',mode='rt',encoding='utf-8') as f: data=f.read() with open('db.txt',mode='wt',encoding='utf-8') as f: f.write(data.replace('kevin','SB'))
6.2 檔案修改方式二:
import os with open('b.txt',mode='rt',encoding='utf-8') as rf,\ open('c.txt',mode = 'wt',encoding='utf-8') as wf: for line in rf: wf.write(line.replace('SB','kevin')) os.remove('b.txt') os.rename('c.txt','b.txt')