文件操作 初識文件操作 我們使用open函數打開文件,獲取到文件句柄,通過文件句柄就可以進行各種各樣的操作。 只讀操作(r,rb) mode表示的是文件的操作類型,encoding表示編碼集(可以不寫,預設utf-8) rb讀取出來的數據是bytes類型的,在rb模式下,不能選擇編碼集。 rb作用: ...
文件操作
初識文件操作
我們使用open函數打開文件,獲取到文件句柄,通過文件句柄就可以進行各種各樣的操作。
只讀操作(r,rb)
f = open("歌姬",mode="r",encoding="utf-8") s = f.read() f.close() # 關閉句柄 print(s)
mode表示的是文件的操作類型,encoding表示編碼集(可以不寫,預設utf-8)
rb讀取出來的數據是bytes類型的,在rb模式下,不能選擇編碼集。
rb作用:可以讀取非文字對象的數據。
讀取文件的方法
read() 一次性全部讀取,占記憶體,如果文件過大,記憶體會崩潰,不推薦
read(n)讀取n個字元,如果再次讀取,會從當前位置繼續讀。如果使用rb模式,則讀取的是n個位元組
readline()一次讀取一行數據,末尾會有個\n,使用strip()或者切片來去掉
readlines()將每一行形成一個元素,放到一個列表,所以讀取出來的是個列表。容易出現記憶體崩潰。
for line in f: 迴圈讀取,每次讀取一行內容,不會產生記憶體溢出的現象。
讀取完的文件句柄一定要關閉 f.close()
寫模式(w, wb)
寫的時候註意,如果沒有創建文件,則創建文件,如果已經創建文件,則會清空這個文件,然後寫入新內容。
追加(a, ab)
只要是a或者ab,a+都是在文件的末尾寫入新內容,不論游標在任何位置。
讀寫模式(r+,r+b)
必須是先讀,後寫。
1 f = open("⼩小娃娃", mode="r+", encoding="utf-8") 2 content = f.read() 3 f.write("麻花藤的最愛") 4 print(content) 5 f.flush() #刷新 6 f.close() 結果: 正常的讀取之後, 寫在結尾
寫讀模式(w+,w+b)
先將所有內容清空 ,然後寫入,最後讀取。
f = open("⼩小娃娃", mode="w+", encoding="utf-8") f.write("哈哈") content = f.read() print(content) f.flush() f.close()
其他相關操作
1.seek(n)操作:游標移動到n位置。移動的單位是bytes,所以UTF-8的中文必須是3的倍數。
移動到開頭:seek(0)
移動到結尾:seek(0,2)seek的第⼆二個參數表⽰示的是從哪個位置進⾏行行偏移, 預設是0, 表 ⽰示開頭, 1表⽰示當前位置, 2表⽰示結尾
tell() 使⽤用tell()可以幫我們獲取到當前游標在什什麽位置
truncate() 截斷文件 ,刪除游標後面的所有內容。一般和seek搭配應用。
深坑請註意: 在r+模式下. 如果讀取了了內容. 不論讀取內容多少. 游標顯⽰示的是多少. 再寫入 或者操作文件的時候都是在結尾進行的操作.所以如果想做截斷操作. 記住了. 要先挪動游標. 挪動到你想要截斷的位置. 然後再進行截斷 關於truncate(n), 如果給出了了n. 則從開頭進⾏截斷, 如果不給n, 則從當前位置截斷. 後⾯ 的內容將會被刪除
修改文件以及另一種打開文件的操作
import os # 創建新文件用來保存修改後的內容 with open("sb","r+") as f,\ open("sb_new","w") as f2: for line in f: new_comment = line.replace("alex","sb") f2.write(new_comment) os.remove("sb") # 將新文件重命名成要修改的文件名,相當於對這個文件進行了修改. os.rename("sb_new","sb")
不需要關閉句柄。