今日主要內容
-
文件操作
- 文件路徑
- 打開方式
- 編碼方式
- 文件句柄
- 文件修改
一、文件操作
(一)文件操作的用途
- 我們運行代碼時產(chǎn)生的數(shù)據(jù)和記錄,存儲在內存中,當程序運行完,產(chǎn)生的數(shù)據(jù)和記錄就會被釋放掉,如果我們需要這個數(shù)據(jù)或記錄以便下次使用,那就需要用文件存儲起來(如商城的購買記錄等)
- 文件操作用于: 持久化存儲數(shù)據(jù)
-
文件操作的三步驟:
- 打開文件
- 操作文件
- 關閉文件
(二)文件操作的格式
-
f = open(文件路徑, 打開方式, 編碼方式)
f = open("text.txt", mode="r", encoding="utf-8") """文件操作""" f.close()
-
with open(文件路徑, 打開方式, 編碼方式) as f:
- 以此方式打開文件不需要手動關閉文件,自動關閉
-
可以打開多個文件
-
with open(...) as f1, open(...) as f2:
-
with open("text.txt", mode="r", encoding="utf-8") as f: """文件操作"""
(三)文件路徑
- 文件路徑:文件所在的位置
- 分為 絕對路徑 和 相對路徑
-
絕對路徑:
- 從磁盤根目錄一直到文件名的路徑
path = "C:\Users\11582\Desktop\筆記\day08"
-
相對路徑
-
同一個文件夾下的文件,如果在同一個文件夾,那么相對路徑就是這個文件名,如果在上一層文件夾則需要:
../
path = "../裝飾器/測試.txt"
-
同一個文件夾下的文件,如果在同一個文件夾,那么相對路徑就是這個文件名,如果在上一層文件夾則需要:
-
轉義:
-
用兩個
\\
代表 -
路徑前加一個r
path = r"C:\Users\11582\Desktop\筆記\day08"
-
用兩個
(四)打開方式
-
mode可以省略,直接填入打開方式,若不填默認為只讀"r"
-
r 只讀 w 只寫(清空寫) a 追加(追加寫) rb 以字節(jié)方式打開文件用于只讀 wb 以字節(jié)方式打開文件用于只寫(清空寫) ab 以字節(jié)方式打開文件用于追加(追加寫) r+ 讀寫 w+ 寫讀(清空寫) a+ 追加寫讀(追加寫) r+b 以字節(jié)方式打開文件用于讀寫 w+b 以字節(jié)方式打開文件用于寫讀(清空寫) a+b 以字節(jié)方式打開文件用于追加(追加寫)
-
mode="r"
- 以只讀方式打開文件
- 默認參數(shù)為只讀"r"
- 文件讀取得到的是字符串
f = open("text.txt", "r", encoding="utf-8") s = f.read() f.close() print(s) # 打印文件內容
-
mode="w"
- 以只寫方式打開文件
- 文件打開時清空文件,之后寫入內容
- 若文件不存在創(chuàng)建文件
- 只能寫入字符串
f = open("text.txt", "w", encoding="utf-8") f.write("文件操作") f.flush() f.close() # 寫入"文件操作"
-
mode="a"
- 以追加方式打開文件,可以在文件末尾追加寫入內容
f = open("text.txt", "a", encoding="utf-8") f.write("文件操作") f.flush() f.close() # 在文件末尾寫入"文件操作"
-
mode="rb"
- 以字節(jié)方式打開文件用于只讀
- 一般用于打開非文本文件,如圖片、音頻、視頻等
- 以"rb"方式打開文件不能輸入編碼方式,輸入會報錯
f = open("LOL.jpg", "rb") s = f.read() f.close() print(s) # 打印文件內容(二進制碼)
-
mode="wb"
- 以字節(jié)方式打開文件用于只寫
- 文件打開時清空文件,之后寫入內容
- 若文件不存在創(chuàng)建文件
- 只能寫入字符串
f = open("LOL.jpg", "rb") s = f.read() f.close() f = open("皮膚.png", "wb") f.write(s) f.flush() f.close()
-
mode="ab"
- 以字節(jié)方式打開文件用于追加,可以在文件末尾追加寫入內容
f = open("LOL.jpg", "rb") s = f.read() f.close() f = open("LOL.jpg", "ab") f.write(s) f.flush() f.close()
-
mode="r+"
- 以讀寫方式打開文件,先讀后寫
- 無論讀到哪個字符,寫都從文件最后開始寫入
- 若先寫入,則會覆蓋文件不會清空,按照對應字節(jié)數(shù)覆蓋
f = open("text.txt", "r+", encoding="utf-8") s = f.read() f.write("文件操作") # 在文件末尾追加"文件操作" f.flush() f.close() print(s)
f = open("text.txt", "r+", encoding="utf-8") f.write("123") # 將文件中的"文"替換成"123" 一個中文對應三個字節(jié) f.flush() f.close()
-
mode="w+"
- 以寫讀方式打開文件
- 因為打開的時候清空文件,無論先寫后讀,還是先讀后寫,都無法讀到內容,所以一般很少用
f = open("text.txt", "w+", encoding="utf-8") f.write("文件操作") f.flush() f.close()
-
mode="a+"
- 以追加寫讀方式打開文件
- 在文件末尾追加
f = open("text.txt", "a+", encoding="utf-8") s.seek(0) s = f.read() f.write("文件操作") f.flush() f.close()
-
mode="r+b"
- 以字節(jié)方式打開文件用于讀寫
-
mode="w+b"
- 以字節(jié)方式打開文件用于寫讀
-
mode="a+b"
- 以字節(jié)方式打開文件用于追加寫讀
(五)編碼方式
- 編碼方式?jīng)Q定文件的讀寫以何種方式進行編碼
- windows使用的編碼方式是GBK(終端)
- Pycharm使用的是編碼方式是UTF-8
- 打開方式所有以 字節(jié)打開 打開的都不能填入編碼方式
(六)文件句柄
-
用來操作文件的媒介,文件操作的所有方法都針對于文件句柄
-
文件句柄是一個迭代器,可以進行for循環(huán)
-
f.read() 讀取全部內容 f.readline() 讀取一行內容 f.readlines() 讀取全部內容 f.close() 關閉文件 f.write() 寫入內容 f.flush() 刷新內容 f.seek() 移動光標 f.tell() 獲取光標位置 f.truncate() 截斷文件
-
f.read()
- 讀取文件全部內容
- 弊端:如果文件過大,導致內存崩潰
-
read(n)
方法可填入?yún)?shù)n,讀取n個字符
f = open("text.txt", "r", encoding="utf-8") s = f.read(3) # 讀取前3個字符 s1 = f.read() # 讀取剩余全部內容 f.close()
-
f.readline()
- 讀取文件一行內容
-
末尾帶一個換行符,可以利用
strip()
刪除
f = open("text.txt", "r", encoding="utf-8") s = f.readline() # 讀取文件一行內容 f.close()
-
f.readlines()
- 讀取文件全部內容,將每一行的內容放在一個列表中
- 每一行內容為一個字符串,末尾帶一個換行符
f = open("text.txt", "r", encoding="utf-8") s = f.readlines() # 讀取文件全部內容,得到一個列表 f.close()
- 注意:文件讀取的結果為字符串類型
-
f.close()
- 關閉文件
- 文件句柄在操作完一定要關閉
f = open("text.txt", "r", encoding="utf-8") s = f.read() f.close() # 關閉文件句柄
-
f.write()
- 向文件中寫入內容
- 若文件存在,先清空文件后寫入(執(zhí)行open的時候就已經(jīng)清空文件了)
- 若文件不存在,新建文件后寫入
f = open("text.txt", "w", encoding="utf-8") f.write("文件操作") # 寫入"文件操作" f.flush() f.close()
- 注意:文件只能寫入字符串,寫入其他類型數(shù)據(jù)會報錯
-
f.flush()
- 刷新緩沖區(qū),立刻寫入磁盤
-
延申:緩沖區(qū)與緩存
-
緩沖區(qū):
- 首先緩沖區(qū)是內存空間的一部分,在內存空間中預留了一定的存儲空間,這些空間用來暫時存儲輸入或輸出的數(shù)據(jù)
- 緩沖區(qū)的存在是因為硬件間存在速度差(比如內存和CPU之間、CPU和硬盤之間)高速硬件會等待低速硬件,這時需要一個緩沖區(qū)來平衡
-
緩存:
- 緩存存在于CPU中,由于CPU運行速度遠大于內存的速度,為了避免頻繁的向內存讀取數(shù)據(jù),將一部分數(shù)據(jù)存在緩存中,CPU需要使用的時候不需要再訪問內存
- 總結:緩沖區(qū)偏重于寫,緩存偏重于讀
-
緩沖區(qū):
f = open("text.txt", "w", encoding="utf-8") f.write("文件操作") f.flush() # 刷新緩沖區(qū) f.close()
-
f.seek()
- 移動光標,文件的讀寫依靠光標進行
-
seek()
方法有兩個參數(shù):- 第一個參數(shù)為移動到的位置
-
第二個參數(shù)為光標從那個位置開始移動
- 0:同開頭開始移動
- 1:從當前位置移動
- 2:從結尾開始移動
- 當?shù)诙€參數(shù)不為0時,第一個參數(shù)必須為0
- 光標移動的單位為字節(jié),如果文本為中文,移動一個字符需要移動三個字節(jié)
f = open("text.txt", "r", encoding="utf-8") f.read() f.seek(0) # 光標移動到開頭 f.read() f.close()
-
f.tell()
- 獲取光標當前位置
f = open("text.txt", "r", encoding="utf-8") f.read() f.seek(0) # 光標移動到開頭 s1 = f.tell() # 開頭位置 f.read() s2 = f.tell() # 結尾位置 f.close()
-
f.truncate()
- 截斷文件,刪除光標后面所有內容
- 截斷文件之前必須要移動光標,否以無法截斷
f = open("text.txt", "r", encoding="utf-8") f.read() f.seek(3) f.truncate() # 第三個字符后面的內容全部被刪除 f.close()
二、文件修改
-
文件修改只能將原文件內容讀取到內存中,將信息修改完畢之后,寫到新的文件中,將原文件刪除,并將新文件重命名成原文件的名字
-
需要導入os模塊用來刪除文件和重命名文件
import os with open("text.txt", "r", encoding="utf-8") as f1,\ open("text副本.txt", "w", encoding="utf-8") as f2: for line in f1: new_line = line.replace("舊內容", "新內容") f2.write(new_line) os.remove("text.txt") # 刪除原文件 os.rename("text副本.txt", "text.txt") # 重名命成原文件
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
