檔案操作
計算機系統分為:計算機硬體,作業系統,應用程式三部分, 我們用python或其他語言撰寫的應用程式若想要把資料永久保存下來,必須要保存于硬碟中,這就涉及到應用程式要操作硬體,眾所周知,應用程式是無法直接操作硬體的,這就用到了作業系統,作業系統把復雜的硬體操作封裝成簡單的介面給用戶/應用程式使用,其中檔案就是作業系統提供給應用程式來操作硬碟虛擬概念,用戶或應用程式通過操作檔案,可以將自己的資料永久保存下來,有了檔案的概念,我們無需再去考慮操作硬碟的細節,只需要關注操作檔案的流程:
一、打開檔案
"""
1、由應用程式向作業系統發起系統呼叫open(...)
2、作業系統打開該檔案,并回傳一個檔案句柄給應用程式
3、應用程式將檔案句柄賦值給變數f
檔案句柄 = open('檔案路徑', '模式','編碼')
"""
#1. 打開檔案,得到檔案句柄并賦值給一個變數
f=open('a.txt','r',encoding='utf-8') # 默認打開模式就為r
#2. 通過句柄對檔案進行操作
con = f.read()
print(con)
#3. 關閉檔案
f.close()
"""
注意:
1、回收作業系統級打開的檔案f.close()
2、編碼
f=open(...)是由作業系統打開檔案,如果沒為open指定編碼,作業系統會用自己的默認編碼去打開檔案,
在windows下是gbk,在linux下是utf-8
"""
#防止忘記不關閉檔案推薦用with
with open('a.txt','a+',encoding='utf-8') as f:
con = f.write('99999999')
print(con)
二、打開模式
1、文本模式(默認)
- r,只讀模式【默認模式,檔案必須存在,不存在則拋出例外】
- w,只寫模式【不可讀;不存在則創建;存在則清空內容】
- a,追加寫模式【不可讀;不存在則創建;存在則只追加內容】
2、位元組模式(對于非文本檔案,圖片,視頻,這種模式無需考慮文本檔案的字符編碼)
- rb,只讀模式【默認模式,檔案必須存在,不存在則拋出例外】
- wb,只寫模式【不可讀;不存在則創建;存在則清空內容】
- ab,追加寫模式【不可讀;不存在則創建;存在則只追加內容】
3、讀寫
- r+,讀寫【可讀,可寫】從檔案開頭寫入
- w+,寫讀【可讀,可寫】清空后再寫
- a+,寫讀【可讀,可寫】從檔案末尾寫入
三、操作方法
- f.read() #讀取所有內容,游標移動到檔案末尾
- f.readline() #讀取一行內容,游標移動到第二行首部
- f.readlines() #讀取每一行內容,存放于串列中,回傳一個list
- f.write('1111\n222\n') #針對文本模式的寫,需要自己寫換行符
- f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,需要自己寫換行符
- f.writelines(['333\n','444\n']) #檔案模式
- f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式
- f.flush() #立刻將檔案內容從記憶體刷到硬碟
- f.readable() #檔案是否可讀
- f.writable() #檔案是否可讀
- f.closed #檔案是否關閉
- f.encoding #如果檔案打開模式為b,則沒有該屬性
四、游標操作
- f.tell() 讀取指標的位置
- f.seek(0) 設定指標的位置
- truncate是截斷檔案,所以檔案的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空檔案了,所以truncate要在r+或a或a+等模式下測驗效果
- read(3) 檔案打開方式為文本模式時,代表讀取3個字符,檔案打開方式為b模式時,代表讀取3個位元組
- seek,tell,truncate游標移動都是以位元組為單位
- seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
五、檔案的修改
檔案的資料是存放于硬碟上的,因而只存在覆寫、不存在修改這么一說,我們平時看到的修改檔案,都是模擬出來的效果
1、方式一
將硬碟存放的該檔案的內容全部加載到記憶體,在記憶體中是可以修改的,修改完畢后,再由記憶體覆寫到硬碟(word,vim,nodpad++等編輯器)
import os
with open('a.txt','r',encoding='utf-8') as read_f,open('.a.txt.swap','w',encoding='utf-8') as write_f:
data=read_f.read() #全部讀入記憶體,如果檔案很大,會很卡
data=data.replace('111','222') #在記憶體中完成修改
write_f.write(data) #一次性寫入新檔案
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
2、方式二【推薦】
將硬碟存放的該檔案的內容一行一行地讀入記憶體,修改完畢就寫入新檔案,最后用新檔案覆寫源檔案
import os
with open('a.txt','r',encoding='utf-8') as read_f,open('.a.txt.swap','w',encoding='utf-8') as write_f:
for line in read_f:
line=line.replace('222','111')
write_f.write(line)
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
六、位元組模式
f = open('a.txt','r',encoding='utf8')
print(f.read())
f.close()
f = open('a.txt','rb')
print(f.read().decode('utf8'))
f.close()
f = open('a.txt','w',encoding='utf8')
print(f.write('hello 合理'))
f.close()
f = open('a.txt','wb')
print(f.write('hello 合理'.encode('utf8')))
f.close()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160295.html
標籤:Python
上一篇:并發編程
