檔案的操作的初識
-
利用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', '檔案的改') # 把新檔案改成原檔案的名字