python的檔案操作
python的檔案操作
1、什麼是檔案
檔案是操作提供給使用者/應用程式存取硬碟的一種機制
2、為何要用檔案
永久儲存資料
3、程式碼如何操作檔案
關鍵字open()
三步走:
1.利用關鍵字open開啟檔案
2.利用其它方法操作檔案
3.關閉檔案
檔案路徑
相對路徑與絕對路徑
所謂相對路徑,就是相對於自己的目標檔案位置。
相對路徑:
絕對路徑:
路徑中出現了字母與斜槓的組合產生了特殊含義如何取消?
在路徑字串前面加一個r
r'D:\pycharm\測試\a.txt'
其中如果開啟一個檔案,需要這三個引數:
open(檔案路徑,讀寫模式,字元編碼)
檔案路徑與讀寫模式是必須的
字元編碼是可選的(有些模式需要編碼)
res = open('a.txt', 'r', encoding='utf8')
檔案執行的流程是這樣的。
開啟檔案,由應用程式向作業系統發起系統呼叫open(...),作業系統開啟該檔案,對應一塊硬碟空間,並返回一個檔案物件賦值給一個變數 res
print(res.read()) 呼叫檔案物件下的讀/寫方法,會被作業系統轉換為讀/寫硬碟的操作
res.close() 向作業系統發起關閉檔案的請求,回收系統資源
開啟一個檔案包含兩部分資源:
應用程式的變數res和作業系統開啟的檔案。在操作完畢一個檔案時,必須把與該檔案的這兩部分資源全部回收,回收方法為:
1、res.close() #回收作業系統開啟的檔案資源
2、del res #回收應用程式級的變數
其中 del res一定要發生在res.close()之後,否則就會導致作業系統開啟的檔案無法關閉,白白佔用資源。
而python自動的垃圾回收機制決定了我們無需考慮del res,這就要求我們,在操作完畢檔案後,一定要記住res.close(),但是大多數人還是會不由自主的忘記res.close,考慮到這一點,python提供了關鍵字with
1、在執行完子程式碼塊後,with 會自動執行f.close()
with open('a.txt','w') as res:
pass
其中,pass只是為了補全語法結構,沒有實際意義。
2、可用用with同時開啟多個檔案,用逗號分隔開即可
with open('a.txt','r') as read_res,open('b.txt','w') as write_res:
data = read_res.read()
write_res.write(data)
指定操作文字檔案的字元編碼
f = open(...)是由作業系統開啟檔案,如果開啟的是文字檔案,會涉及到字元編碼問題,如果沒有為open指定編碼,那麼開啟文字檔案的預設編碼很明顯是作業系統說了算了,作業系統會用自己的預設編碼去開啟檔案,在windows下是gbk,在linux下是utf-8。
這就用到了上節課講的字元編碼的知識:若要保證不亂碼,檔案以什麼方式存的,就要以什麼方式開啟。
f = open('a.txt','r',encoding='utf-8')
控制檔案讀寫操作的模式
只需要記住3個①. 'r'(預設的):只讀 ②.'w':只寫 ③.'a':只追加寫
r 只讀模式(只能看不能改)
# 路徑不存在:直接報錯
with open(r'b.txt', 'r', encoding='utf8') as f:
pass
# 路徑存在
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 讀取檔案內所有的內容
f.write('123') # 寫檔案內容
w 只寫模式(只能寫不能看)
# 路徑不存在:自動建立
# with open(r'b.txt', 'w', encoding='utf8') as f:
# pass
# 路徑存在:1.會先清空檔案內容 2.再執行寫入操作
with open(r'a.txt', 'w', encoding='utf8') as f:
# f.read()
f.write('hello world!\n')
f.write('hello world!\n')
f.write('hello world!\n')
執行之前
執行
執行之後直接被清空重新寫入hello world!
a 只追加模式(追加內容)
#路徑不存在:自動建立
# a模式 只追加模式
with open(r'a.txt','a',encoding='utf8') as f:
pass
路徑存在:不會清空檔案 在檔案末尾新增內容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('\n今天週四了 馬上又要放假了 好開心!')
執行五次之後
小總結
我們所使用的r w a讀寫模式都只能操作文字檔案
檔案操作方法
# 檔案操作方法
# 1.讀系列
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()) # 一次性讀取檔案內所有的內容
# print(f.readline()) # 每次只讀檔案一行內容
# print(f.readlines()) # 讀取檔案所有的內容 組織成列表 每個元素是檔案的每行內容
# print(f.readable()) # 判斷當前檔案是否具備讀的能力
# 2.寫系列
with open(r'a.txt','w',encoding='utf8') as f:
# f.write('克服一切困難 奧利給!') # 往檔案內寫入文字內容
# f.write(123) # 寫入的內容必須是字串型別
# f.writelines(['jason','kevin','tony']) # 可以將列表中多個字串元素全部寫入
# print(f.writable()) # True
# print(f.readable()) # False
f.flush() # 直接將記憶體內檔案資料刷到硬碟 相當於ctrl+s
檔案優化操作
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()) # 一次性讀取檔案內所有的內容
# print(f.read()) # 一次性讀取檔案內所有的內容
# print(f.read()) # 一次性讀取檔案內所有的內容
"""
1.一次性讀完之後 游標停留在了檔案末尾 無法再次讀取內容
2.該方法在讀取大檔案的時候 可能會造成記憶體溢位的情況
解決上述問題的策略就是逐行讀取檔案內容
"""
# for line in f: # 檔案變數名f支援for迴圈 相當於一行行讀取檔案內容
# line
'''以後涉及到多行檔案內容的情況一般都是採用for迴圈讀取'''