一.文件操作
fp =open("文件名",mode="采用的模式",encoding="使用什么編碼集")
fp 這個變量接受到open的返回值 是一個文件io對象 (又稱文件句柄)
i => input 輸入
o => output輸出
有了對象之后,就可以使用對象.屬性 或者 對象.方法進行操作
fp.write("字符串")
fp.close() #關閉文件
fp.read() #讀取內容
1.文件的寫入和讀取
#(1)文件的寫入
#打開文件
fp = open("test.txt",mode='w',encoding='utf-8') #把冰箱門打開
#寫入文件
fp.write("把大象放進去")
#關閉文件
fp.close()
#創建了test.txt文本且文本內容如下:
#(2)文件的讀取
#打開文件
fp = open("test.txt",mode='r',encoding='utf-8') #把冰箱門打開
#讀取文件
res = fp.read()
#關閉文件
fp.close()
print(res)
#會輸出:大象放進去
2.將字符串和字節流(Bytes流)類型進行轉換
(參數寫成轉化的字符編碼格式)
#encode() 編碼 將字符串轉化為字節流(Bytes流)
#decode() 解碼 將Bytes流轉化為字符串
#(1)
strvar = "今天"
bt = strvar.encode("utf-8") #編碼稱成節流
print(bt)
res2 = bt.decode("utf-8") #解碼成字符串
print(res2)
#輸出的結果為:
#(2)wb 和 rb 模式 二進制字節流模式 (注意點:使用字節流模式的時候,不要指定encoding)
#文件的寫入
#例1:
fp = open("test.txt",mode="wb")
strvar = "好晴朗"
res = strvar.encode("utf-8")
fp.write(res)
fp.close()
#如果沒有test.txt文本會創建一個並把”好晴朗”寫入文件中.
#文件的讀取
#例2:
fp = open("test.txt",mode="rb")
#讀取文件
res = fp.read()
fp.close()
print(res)
res2 = res.decode("utf-8")
print(res2)
#因為例1寫入:好晴朗 輸出的內容是分別是沒有解碼的”好晴朗”的二進制流和解碼后的內容
#(3)復制圖片 (圖片或視頻之類的二進制字節流的內容,都可以使用b模式,比如wb,rb...)
#打開文件
fp = open("ceshi.png",mode="rb")
#讀取文件
res = fp.read()
#關閉文件
fp.close()
#打開文件
fp = open("ceshi2.png",mode="wb")
#寫入文件
fp.write(res)
#關閉文件
fp.close()
3.擴展模式 + w+ r+ a+
#(utf-8 編碼格式下 默認一個中文三個字節 一個英文或字符 占用一個字節)
#read() 功能:讀取字符的個數(里面的參數代表字符個數)
#seek() 功能:調整指針的位置(里面的參數代表字節個數)
#tell() 功能:當前光標左側所有字節數(返回字節數)
把光標移動到文件行首
fp.seek(0)
把光標移動到文件末尾
fp.seek(0,2)
#(1)r+ 可讀可寫 (先讀后寫)
fp = open("0506_3.txt",mode="r+",encoding="utf-8")
res = fp.read()
#print(res) #先讀出文件有什么內容
fp.write("e") #從光標的位置寫入內容
#把光標移動到第0個字節上,那就是文件開頭
fp.seek(0) #將文件的光標移動到開頭
res = fp.read() #從光標的位置開始讀取文件內容
print(res)
fp.close()
#(2)r+ 可讀可寫 (先寫后讀)
fp = open("0506_3.txt",mode="r+",encoding="utf-8")
#把光標移動到文件末尾
fp.seek(0,2)
fp.writelines("123")
fp.seek(0)
res = fp.read()
print(res)
fp.close()
#(3)w+ 可讀可寫 (沒有文件的話,會自動創建)
fp = open("0506_4.txt",mode="w+",encoding="utf-8")
fp.write("123456")
fp.seek(0)
res = fp.read()
print(res)
fp.close()
#(4)a+ 可讀可寫 append (寫入的時候,強制把光標移動到最后)
fp = open("0506_4.txt",mode="a+",encoding="utf-8")
fp.seek(0)
fp.write("444444")
fp.seek(0)
res = fp.read()
print(res)
fp.close()
#(5)tell read seek 注意 seek 括號里的字節數 read 括號里的字節數
fp = open("0506_4.txt",mode="a+",encoding="utf-8") #當前光標在內容的最后一個
res = fp.tell() #從光標左側所有字節數,
print(res) #內容為:123456789 光標在9的后面,所以輸出9
fp.seek(5) #將光標跳到第五個字節,
res = fp.tell() #所以光標在12345
print(res) #6 5和6的位置,所以輸出5
res = fp.read(2) #讀取2個字符(往后讀兩個字節)
res = fp.tell() #再次統計字節數(5+2)
print(res) #所以輸出7
fp.close()
注意有中文的情況 如果移動錯誤 有可能讀取不出來
#例:
fp =open("0506_4.txt",mode="a+",encoding="utf-8")
res = fp.tell()
print(res)
fp.seek(2)
res = fp.tell()
print(res)
fp.read(2)
res = fp.tell()
print(res)
#當前后面的字符是天 如果用seek移動一個字節
fp.seek(5)
res = fp.tell()
print(res)
res = fp.read()
fp.close()
#(6) with操作 語法 自動關閉文件 相當於幫你執行了fp.close
# as 相當於起別名fp = open("0506_5.txt",mode="w",encoding="utf-8")
#with 是一個代碼塊 不要落下冒號:
with open("0506_5.txt",mode="w",encoding="utf-8") as fp:
#往文件里面寫的內容只能是字符串 或者 字節流
fp.write("123")
最后的內容:123
二.文件的相關函數
1.flush
#刷新緩沖區 flush
#當文件關閉的時候自動刷新緩沖區
#當整個程序運行結束的時候自動刷新緩沖區
#當緩沖區寫滿了 會自動刷新緩沖區
#手動刷新緩沖區
#例1:
fp = open("0506_6.txt",mode="w+",encoding="utf-8")
fp.write("123445")
#手動刷新緩沖區
fp.flush()
while True:
pass
fp.close()
2.文件對象具有迭代性
#readable() 功能: 判斷文件對象是否可讀
#writable() 功能: 判斷文件對象是否可寫
#例1:
fp =open("0506_6.txt",mode="r",encoding="utf-8")
res1 = fp.readable()
res2 = fp.writable()
print(res1) #True
print(res2) #False
for i in fp:
print(i)
文件里面的內容為:
123445
231031
32131y
321y0
3.文件的相關函數
#(1)readline() 功能: 讀取一行文件內容
readline(字符數)
如果給的參數大於當前行字符數,只獲取當前行所有內容
如果給的參數小於當前行字符數,按照實際給的參數進行字符的獲取
#例:
with open("0506_6.txt",mode="r+",encoding="utf-8") as fp:
res = fp.readline(300)
print(res)
#0 0.0 0j False '' [] () set() {} None
#循環打印文件里面每一行的內容
#while res:
#print(res)
#res = fp.readline()
#(2)readlines() 功能:將文件中的內容按照換行讀取列表當中
#例:
lst = []
with open("0506_6.txt",mode="r+",encoding="utf-8") as fp:
res = fp.readlines()
for i in res:
res2 = i.strip()
lst.append(res2)
print(lst)
#(3)writelines() 功能: 將內容是字符串的可迭代性數據寫入文件中
# 參數:內容為字符串類型的可迭代數據
#例:
with open("0506_6.txt",mode="r+",encoding="utf-8") as fp:
#strvar = "今天天氣好晴朗"
lst = ["親愛的\n","美女\n","請看我\n","一眼\n"]
fp.writelines(lst)
效果如下:
親愛的
美女
請看我
一眼
# (4)truncate() 功能:把要截取的字符串提取出來,然后清空內容將提取的字符串重新下入文件中(字節)
#例:
with open("0506_6.txt",mode="r+",encoding="utf-8") as fp:
fp.seek(9)
fp.truncate() #截取6個字節的內容重新寫入
#效果是剩: 親愛
注意區分:
read(字符)
readline(字符)
seek(字節)
truncate(字節)
tell返回的是字節