文件操作基本流程:
1. 介紹
計算機系統是由計算機硬件,操作系統,和應用程序三部分組成.
內存 存放不持久
硬盤 可以使數據持久化
文件操作 數據持久化的一種
全棧開發 框架類
2. 文件的操作流程
打開文件, 得到文件句柄並賦值給變量
f = open("a.txt","r",encoding="utf-8")
通過句柄對文件操作
data=f.read()
關閉 文件
f.close()
只讀操作(**r, **rb)
f = open("護士少婦嫩模.txt",mode="r",encoding="utf-8")
content = f.read()
print(content)
f.close()
rb 讀出來的數據是bytes類型,在rb模式下,不能選擇encoding.
rb的作用:在讀取非文本文件的時候. 比如圖片,MP3,視頻等就需要用到rb.因為這種數據沒辦法直接顯示出來.
f = open("護士少婦嫩模.txt",mode="rb")
content=f.read()
print(content)
f.close()
讀取文件的方法:
read() 是將文件中所有的內容讀出來
read(n) 是讀取n個字符.
比如: 友誼地久天長
read(3) 結果就是 "友誼地" 把前三個字讀出來. 需要注意的是,如果再次讀取, 會在當前位置繼續往后讀,而不是從頭開始讀. 例如,再來一個read(3) 得到的結果就是 "久天長"
如果是rb模式, 就是讀3個字節
readline() 一次讀取一行數據. 注意:每次讀取出來的數據都會有一個換行符 \n, 我們要使用strip()方法去掉\n
readlines()將一行形成一個元素,放到一個列表中. 占內存 不推薦使用.
*** 循環讀取, 每次讀一行內容. 不會產生內存溢出
f = open("a.txt",mode="r",encoding="utf-8")
for line in f:
print(line.strip())
f.close() 一定要注意關閉
寫模式(**w,wb)
寫的時候,如果沒有文件,就會先創建文件; 如果文件存在就會將原來的內容先刪除, 再寫入新的內容.
f = open("小娃娃.txt",mode="w",encoding="utf-8")
f.write("金毛獅王")
f.flush() #刷新
f.close()
wb模式: 可以不指定打開文件的編碼,但是在寫入文件的時候必須把字符轉換成"utf-8"
f = open("小娃娃.txt",mode="wb")
f.write("金毛獅王", encoding("utf-8"))
f.flush() #刷新
f.close()
追加(**a,ab)
在追加的模式下,寫入的內容會追加在文件的結尾
f = open("小娃娃",mode="a",encoding="utf-8")
f.write("馬化騰")
f.flush()
f.close()
讀寫模式(**r+, r+b)
讀寫模式必須是先讀. 因為默認光標在開頭,讀完之后再寫入. r+模式是以后使用頻率最高的.
f = open("小娃娃",mode="r+",encoding="utf-8")
content = f.read()
f.write("馬化騰的汽車") #會接着原來的內容繼續往后寫,沒有換行
print(content)
f.flush()
f.close()
寫讀模式(w+, w+b )
先將所有的內容清空,然后寫入,最后讀取. 但是讀取的內容是空的. 不常用.
追加讀(a+)
a+模式下,不論是先讀還是后讀,都讀取不到數據.
追加都是在最后的位置,先讀的話,后面沒內容,讀不出來, 如果寫完再讀,光標還是在最后 ,還是讀不到內容.
***其他操作
1. **seek() seek(n)光標移動到n位置,注意,移動的單位是byte,如果是utf-8中文部分要是3的倍數
**移動到開頭: seek(0)
移動到結尾: seek(0,2) seek的第二個參數表示的是從哪個位置進行偏移,默認是0,表示開頭, 1表示當前位置, 2表示結尾
f = open("小娃娃",mode="r+",encoding="utf-8") f.seek(0) #光標移動到開頭 content = f.read() #讀取內容,此時光標移動到結尾 print(content) f.seek(0) #再次將光標移動到開頭 f.seek(0,2) #將光標移動到結尾 content2 = f.read() #讀取內容, 什么都沒有 print(content2) f.seek(0) # 移動到開頭 f.write("張國榮") #寫入信息 會把之前有的信息覆蓋掉. ,此時光標在9, 中文3*3個=9 f.flush() f.close()
2. tell() 幫忙找到當前光標的位置
f = open("小娃娃",mode="r+",encoding="utf-8") f.seek(0) #光標移動到開頭 content = f.read() #讀取內容,此時光標移動到結尾 print(content) f.seek(0) #再次將光標移動到開頭 f.seek(0,2) #將光標移動到結尾 content2 = f.read() #讀取內容 什么都沒有 print(content2) f.seek(0) #移動到開頭 f.write("張國榮") #寫入信息,此時光標在9 print(f.tell()) #光標位置9 f.flush() f.close()
3. truncate()截斷文件
#truncate() 截斷文件 f = open("小娃娃",mode="w",encoding="utf-8") f.write("哈哈") #寫入2個字符 f.seek(3) #光標移動到3, 也就是兩個字的中間 f.truncate() #刪除光標后面的所有內容 f.close()
f = open("小娃娃",mode="r+",encoding="utf-8") content=f.read(3) #讀取12個字符 f.seek(4) #移動4個byte print(f.tell()) f.truncate()#后面的所有內容全部刪除 f.flush() f.close()
注意:在r+模式下,如果讀取了內容,不論讀取多少,光標顯示的是多少,再寫入或者其他操作文件的時候, 都是在結尾進行的.
***修改文件
文件修改:只能將文件中的內容讀取到內存中,將信息修改完畢,然后將源文件刪除,將新文件名修改成老文件名
##文件修改 import os with open("小娃娃",mode="r",encoding="utf-8") as f1,\ open("小娃娃_new",mode="w",encoding="utf-8") as f2: content = f1.read() new_content = content.replace("冰糖葫蘆","大白梨") f2.write(new_content) os.remove("小娃娃") #刪除源文件 os.rename("小娃娃_new","小娃娃") #重新命名新文件
弊端:一次將所有內容讀出來,內存溢出. 可以一行一行讀取.
import os with open("小娃娃",mode="r",encoding="utf-8") as f1,\ open("小娃娃_new",mode="w",encoding="utf-8") as f2: for line in f1: new_line = line.replace("冰糖葫蘆","大白梨") f2.write(new_line)
os.remove("小娃娃") #刪除源文件 os.rename("小娃娃_new","小娃娃") #重新命名新文件