利用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
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('追加一點。。'))
\代表
這一行代碼沒有完從下一行開始
七、文件操作的改
現存所有的軟件對文件修改都是經歷這五步(底層)
1、以讀的模式打開原文件
2、以寫的模式創建一個新文件。
3、將原文件的內容讀出來修改成新內容,寫入新文件。
4、將原文件刪除。內存級別
5、將新文件重命名成原文件
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', '文件的改') # 把新文件改成原文件的名字