Python基礎學習筆記(07)檔案操作
阿新 • • 發佈:2020-07-06
Python基礎學習(08)
一、今日內容大綱
- 初識檔案操作
- 檔案操作的模式
- 檔案操作的其他功能
- 開啟檔案的另一種方式
- 檔案的修改操作
二、檔案操作的初識
-
利用Python操作為檔案,需要的必要引數:
-
檔案路徑:Path
-
開啟方式:只讀、只寫、追加、寫讀、讀寫
-
編碼方式:UTF-8、GBK、GB2312等
-
-
檔案的基本操作
先觀察一段檔案操作的程式碼:
f1 = open(r'D:\Python\Python Project\day08\Japanese Porn.txt',encoding= 'utf-8',mode= 'r') content = f1.read() print(content) f1.close()
- open 是系統內建函式,open 底層呼叫的是作業系統的介面
- f1 變數又可寫作 f1、fh、file_handler、f_h 等,譯為檔案控制代碼,Python語言中對檔案進行的任何操作,都需要通過呼叫檔案控制代碼的函式來實現。
- encoding 引數可以省略,不寫引數會按照作業系統預設的編碼來操作
- close 為關閉檔案控制代碼,每次開啟檔案後都需要及時關閉檔案控制代碼,否則會佔用過多記憶體。
-
檔案操作三部曲:
- 開啟檔案
- 對檔案控制代碼進行相應的操作
- 關閉檔案控制代碼
-
報錯情況
- 路徑問題:反斜槓會引起歧義
- 解決方式一:雙反斜槓消除歧義,如:'d:\Japanese Porn.txt'
- 解決方式二:在路徑整體前加入r,如:r'd:\Japanese Porn.txt'
- 編碼問題:檔案儲存和開啟時用的編碼不一致
- 檔名問題:檔名問題:檔名不可以設定成純數字,否則會無法識別
- 路徑問題:反斜槓會引起歧義
三、檔案操作的模式(mode)
-
檔案的讀取操作:r 模式、rb 模式、r+ 模式、r+b 模式
首先先在 py 檔案根目錄下建立一個”檔案的讀“文字檔案和一個”美女.jpg“圖片檔案(這樣讀取時可以只需提供相對路徑),供我們讀取,其中文字檔案內容我們編輯為:
太白金星最帥 老男孩最好的老師 老男孩教育是最好的學校 dasfasfdasfsda asdqwedqwe
-
r 模式:操作的是文字檔案,會將讀取的位元組轉換成字元
# 1.read() f = open('檔案的讀', encoding='utf-8') # mode是r可以預設不寫 1. read() 全部都出來 content = f.read() print(content) # content 為字串資料型別 f.close() # 2.read(n) 按照字元數量讀取,如reaad(n)為讀取前n個字元 content = f.read(4) print(content) f.close() # result: 太白金星 # 3.readline() 讀一行 line = f.readline() print(line) f.close() # result: 太白金星最帥. # 4. readlines() 返回一個列表,列表中的每個元素是原始檔的每一行 l1 = f.readlines() print(l1) f.close() # result: ['太白金星最帥\n', '老男孩最好的老師\n', '老男孩教育是最好的學校\n', 'dasfasfdasfsda\n', 'asdqwedqwe'] # 5. for 讀取(佔用記憶體最低,對於大檔案最友好) for line in f: print(line) f.close() # result: # 太白金星最帥 # # 老男孩最好的老師 # # 老男孩教育是最好的學校 # # dasfasfdasfsda # # asdqwedqwe
-
rb 模式:操作的是非文字檔案,不會將讀取的位元組轉換成字元
f = open('美女.jfif',mode='rb') # 帶b的模式操作檔案不需要宣告編碼方式 content = f.read() print(content) f.close() # result: # b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xdb\x00C\x00\x07\x05\x05\x06\x05\x04\x07\x06\x05\x06....
-
-
檔案的寫入操作:w 模式、wb 模式、w+ 模式、w+b 模式
-
w 模式:主要操作文字類檔案
# 沒有檔案,建立檔案,寫入內容 fh = open('檔案的寫', encoding='utf-8', mode='w') fh.write('隨便寫一點') fh.close() # 如果檔案存在,會先清空原檔案內容,再寫入新內容 fh = open('檔案的寫', encoding='utf-8', mode='w') fh.write('再寫一點') fh.close()
-
wb 模式:主要操作非文字類檔案,也可操作文字類檔案
# 為了能夠成功寫入圖片,我們參考學習讀時的圖片的機器語言 f = open('美女.jpg',mode='rb') content = f.read() f.close() f1 = open('美女2.jfif', mode='wb') f1.write(content) f1.close()
-
-
檔案的追加操作:a 模式、ab 模式、a+ 模式、a+b 模式
-
a 模式
# a 模式 # 沒有檔案會建立檔案,追加內容 f = open('檔案的追加', encoding='utf-8', mode='a') f.write('太白最帥。。。') f.close() # 有檔案會再後面追加 f = open('檔案的追加', encoding='utf-8', mode='a') f.write('老八祕製小漢堡') f.close()
-
-
檔案的其他操作模式:
# r+ 模式:讀和追加 f = open('檔案的讀寫', encoding='utf=8', mode='r+') content = f.read() print(content) f.write('簡簡單單的晚飯') f.close()
-
檔案操作中的”游標“
檔案的操作存在一個“游標”的概念,當你進行讀寫操作時,游標會隨之進行移動,如 f.read() 操作後游標會隨著讀取停止在檔案內容最後一位,此時在進行寫的操作,會從游標的位置繼續寫入。如果在r+模式下先寫後讀,游標寫入覆蓋之前的資料,且容易因為不同字元byte佔用不同情況引起亂碼,所以不能使用。
四、檔案操作的其他功能
-
tell() 獲取游標的位置,單位為位元組
# tell() 獲取游標的位置,單位為位元組 f = open('檔案的讀', encoding='utf-8') # mode是r可以預設不寫 print(f.tell()) f.read() print(f.tell()) # content 為字串資料型別 f.close() # result: # 0 # 107
-
seek() 調整游標的位置,單位為位元組,返回游標的位置
-
flush() 強制重新整理,新增在寫入資料之後,可以有效儲存資料
# flush() 強制重新整理,新增在寫入資料之後,可以有效儲存資料 f = open('檔案的其他功能', encoding='utf-8', mode='w') f.write('asdasd') f.flush() f.close()
五、開啟檔案的另一種方式
# 優點1:不用手動關閉檔案控制代碼,會一定時間內自動關閉
with open('檔案的讀', encoding='utf-8') as f1:
print(f1.read())
# 優點2:可以同時操作多個檔案控制代碼
with open('檔案的讀', encoding='utf-8') as f1,\
open('檔案的寫', encoding='utf-8', mode='w') as f2:
print(f1.read())
f2.write('dasdas')
# 缺點:待續
六、檔案的修改操作
檔案修改的核心步驟:
- 以讀的模式開啟原檔案
- 以寫的模式建立一個新檔案
- 將原檔案的內容讀出來修改成新內容,寫入新檔案
- 將原檔案刪除
- 將新檔案重新命名成原檔案
首先先在 建立一個”alex自述“文字檔案,供我們讀取和修改,其中文字檔案內容我們編輯為:
alex是老男孩python發起人,建立人。
alex其實是人妖。
誰說alex是sb?
你們真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。
# low 版
import os
# 1.以讀的模式開啟原檔案
# 2.以寫的模式建立一個新檔案
with open('alex自述', encoding='utf-8', mode='r') 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
# 1.以讀的模式開啟原檔案
# 2.以寫的模式建立一個新檔案
with open('alex自述', encoding='utf-8', mode='r') as f1,\
open('alex自述.bak', encoding='utf-8', mode='w') as f2:
# 3.將原檔案的內容讀出來修改成新內容,寫入新檔案
for line in f1:
new_line = line.replace('SB','alex')
f2.write(new_line) # 檔案控制代碼還未關閉,所以不會重新覆蓋
# 4.將原檔案刪除
os.remove('alex自述')
# 5.將新檔案重新命名成原檔案
os.rename('alex自述.bak','alex自述')