day-08-文件管理
文件的操作的初識
-
利用python程式碼寫一個很low的軟體,去操作文件。
-
文件路徑:path
-
打開方式:讀,寫,追加,讀寫,寫讀……
-
編碼方式:utf-8,gbk ,gb2312……
f1 = open('d:\聯繫方式.txt', encoding='utf-8', mode='r') content = f1.read() print(content) # 輸出: 練習方式:123456
-
open:內置函數,open底層調用的是作業系統的借口。
-
f1是變數,也叫文件句柄。對文件進行的任何操作,都得通過文件句柄。
-
encoding:可以不寫,不寫參數,默認的編碼本:作業系統默認的編碼
-
Windows:gbk
-
Linux:utf-8
-
mac:utf-8
-
-
f1.close():關閉文件句柄,不然會一直佔用記憶體。
-
-
文件操作三部曲
-
打開文件
-
對文件句柄進行相應的操作
-
關閉文件
-
-
報錯原因:
-
UnicodeDecodeError:文件儲存時與文件打開時編碼運用不一致。
-
r'C:\Users\YS\Desktop\聯繫方式.txt'
-
(1)r 模式:讀取得數據類型是 str ,操作的是文本文件
-
read(n) :讀幾個字元 ,n不寫默認全讀
f = open('文件的讀.txt',encoding='utf-8') content = f.read(5) print(content) f.close() # 輸出 讀讀讀讀
-
readline():讀幾行,寫幾遍,讀幾行
f = open('文件的讀.txt',encoding='utf-8') print(f.readline()) print(f.readline()) print(f.readline()) f.close() # 輸出 讀讀讀讀 aaaa ABCD
-
readlines():返回一個列表,列表中的每個元素是源文件的每一行。
f = open('文件的讀.txt',encoding='utf-8') content = f.readlines() print(content) f.close() # 輸出 ['讀讀讀讀\n', 'aaaa\n', 'ABCD\n', '!@#¥']
-
for 讀取,和 for 循環 readlines 一樣的輸出效果
但是 for 讀取始終佔用一行的記憶體,對於大數據的讀取 readlines 因為他會生成一個字典,會一下把記憶體給佔滿(幾十個G的數據)
f = open('文件的讀.txt',encoding='utf-8') for lin in f: print(lin) f.close() # 輸出 讀讀讀讀 aaaa ABCD !@#¥模式
(2)rb模式:
-
操作的是非文本的文件,圖片,影片,音頻。rb 模式讀取的數據類型為 bytes
-
讀取方式和 r 是樣的
read(),readline(),readlines(),for
f = open('LOL.png',mode='rb') conten = f.read() # 方式和 r 模式是一樣的 print(conten) f.close() # 輸出的是bytes數據格式 b'\x89PNG\r\n\x1a\n........'
文件操作的寫
(1)w 模式:
-
有關寫(w)的清空的問題:關閉文件句柄,再次以 w 模式打開此文件時才會清空
-
write()
# 沒有文件,創建文件,寫入內容,在當前目錄下。 f = open('文件的寫', encoding='utf-8', mode='w') # 』文件的寫『為文件名 conten = f.write('隨便寫一點。。。') f.close() # 如果文件存在,先清空原文件內容,在寫入新內容 f = open('文件的寫', encoding='utf-8', mode='w') conten = f.write('多寫一點。。。') f.close()
(2)wb 模式,操作非文本文件
f = open('LOL.jpg', mode='rb') content = f.read() # 先獲取一個bytes格式的數據 f.close() # 沒有文件,創建文件,寫入內容 寫入數據格式為bytes(非Unicode編碼)在當前目錄下 f1 = open('LOL2.jpg', mode='wb') content1 = f1.write(content) f1.close()
文件操作的追加
(1)a 模式
# 沒有文件創建文件,追加內容,有文件就直接在原文件的最後面追加。 f = open('文件的追加', encoding='utf-8', mode='a') content = f.write('追加一點。。。。') f.close()
文件操作的其他模式
(1)r+ 模式:文件的讀和寫,先讀後寫,讀一個游標往後移一個,寫在最後面游標所在的位置,(讀並追加)
# 讀並追加 順序不能錯,不能創建 f = open('文件的讀寫',encoding='utf-8',mode='r+') content = f.read() # 先讀 print(content) f.write('隨便寫一點。。。') # 後追加
文件操作的其他功能
-
總結:
-
三個大方向:
-
讀,四種模式: r rb r+ r+b
-
寫,四種模式: w wb w+ w+b
-
追加:四種模式:a ab a+ a+b
相應的功能:對文件句柄的操作:read,raed(n),readline(),readlines(),write()
-
-
tell():方法獲取游標的位置,單位是位元組。
f = open('文件的讀寫', encoding='utf-8') print(f.tell()) # 獲取讀之前游標所在的位置為 0 content = f.read() # 讀,讀一個字元游標往後移一個字元 print(f.tell()) # 獲取讀之後游標所在的位置為 30 print(content) # 輸出 0 30 隨便寫一點點點點點點
-
seek():調整游標的位置
f = open('文件的讀寫',encoding='utf-8') f.seek(6) # 把游標的位置調整到第6個位元組 print(f.tell()) # 獲取游標的位置為為6 content = f.read() # 從游標調整的位置開始讀:寫一點點點點點點 print(f.tell()) # 獲取游標讀之後的位置為30 # 輸出 6 30 寫一點點點點點點
-
flush:強制刷新,相當於保存。
f = open('文件的讀寫', encoding='utf-8', mode='w') content = f.write('追加一點。。。。') f.flush() # 保存一下,Python會自動保存,有些不會 f.close() # 退出
-
打開文件的另一種方式
-
with open():
-
優點1:不用手動關閉文件句柄,會在一定時間關閉
-
優點2:可以一個語句操作多個文件句柄,一個with可以操作多個open
with open('文件的讀', encoding='utf-8') as f1, \ open('文件的追加', encoding='utf-8', mode='a') as f2: print(f1.read()) print(f2.write('追加一點。。'))
\代表
這一行程式碼沒有完從下一行開始
-
文件操作的改
-
現存所有的軟體對文件修改都是經歷這五步(底層)
-
以讀的模式打開原文件
-
以寫的模式創建一個新文件。
-
將原文件的內容讀出來修改成新內容,寫入新文件。
-
將原文件刪除。記憶體級別
-
將新文件重命名成原文件
-
-
low版的,因為用的是 read() 只針對小的文件,大的文件 read() 讀的時候就會把記憶體佔滿(一次全讀)
import os with open('文件的改', encoding='utf-8') as f1, \ # 讀取要讀取的文件 open('文件的改.txt', encoding='utf-8', mode='w') as f2: # 新建一個新文件 low = f1.read() # 讀取 content_low = low.replace('Python', 'PHP') # 修改讀取的文件內容 content_new = f2.write(content_low) # 修改後寫入新文件 os.remove('文件的改') # 刪除原文件 os.rename('文件的改.txt', '文件的改') # 把新文件改成原文件的名字
-
進階版。for 每次循環讀取每一行的值,只佔用當前一行的記憶體,佔用資源少。
import os with open('文件的改', encoding='utf-8') as f1, \ # 讀取要改的文件 open('文件的改.txt', encoding='utf-8', mode='w') as f2: # 新建一個文件 for low in f1: # for 循環讀取要改文件的每一行 content_new = low.replace('Python', 'PHP') # 每循環一行修改一行 f2.write(content_new) # 修改後的每一寫入新文件 os.remove('文件的改') # 刪除原文件 os.rename('文件的改.txt', '文件的改') # 把新文件改成原文件的名字