程式的執行作業系統把相關的檔案從硬碟載入到記憶體中,在記憶體中呼叫執行,當程式結束的時候,記憶體空間釋放,執行的結果得不到儲存,程式是一次性的。為了解決這個問題,我們在編碼中引入檔案的概念,通過檔案我們把上次執行的結果儲存在硬碟中。
python提供呼叫函式open()來開啟檔案,將檔案載入在記憶體中,供程式操作,操作完成後,再從記憶體寫入硬碟。
f =
open
('te.txt'
,mode=
'r+'
,encoding=
'utf-8'
)'''
第乙個引數"te.txt"一般是檔案路徑+檔名,當與python指令碼在同級目錄下時寫檔名即可。
第二個引數『mode = 』表示檔案開啟的模式。
第三個引數"encoding = "表示檔案的編譯碼方式,如果編譯碼方式不一致的話,python會報錯,
檔案寫入硬碟最終以二進位制的方式寫入,當我們寫入文字的時候,會通過encoding的編碼方式把
文字轉換為二進位製碼,也叫位元組流。
'''
(utf-8編碼格式下 預設乙個中文三個位元組 乙個英文或符號 占用乙個位元組)
read() 功能: 讀取字元的個數(裡面的引數代表字元個數)
seek() 功能: 調整指標的位置(裡面的引數代表位元組個數)
tell() 功能: 當前游標左側所有的位元組數(返回位元組數)
seek(0) 直接把游標移動到檔案開頭
seek(0,2) 直接把游標移動到檔案末尾
檔案開啟的方式常見的為三種:
r、w、a.
r,表示檔案的讀取,這種模式下對於檔案只用讀取的許可權,不能修改新增,如果呼叫write方法就會報錯。
#開啟檔案
f =open
('te.txt'
,mode=
'rt'
,encoding=
'utf-8'
)#讀取內容
data=f.read(
)print
(data)
#關閉檔案
f.close(
)執行結果:
hello,world!
#這行文字是我手動寫入的。
w,表示寫入檔案,w模式下如果檔案不存在那麼就以第乙個引數的檔名建立乙個檔案,如果那個檔案存在,那麼把檔案中的內容清空,再在本次寫入新內容。
# 1.開啟檔案
fp =
open
("te.txt"
,mode=
"w",encoding=
"utf-8"
)# 把冰箱門開啟
# 2.寫入內容
fp.write(
"把大象塞進去"
)# 把大象放進去
fp.weite(
"大象覺得有點冷"
)# 3.關閉檔案
fp.close(
)# 把冰箱門關上
通過在同一指令碼中執行這三行**,檔案te.txt的內容被改變成了:把大象塞進去
#強調:
# 1 在檔案不關閉的情況下,連續的寫入,後寫的內容一定跟在前寫內容的後面
# 2 如果重新以w模式開啟檔案,則會清空檔案內容
a,表示追加寫模式: 在檔案不存在時會建立空文件,檔案存在會將檔案指標直接移動到檔案末尾,在末尾寫入新的內容。在此模式下不能呼叫read()。以 a 模式重新開啟檔案,不會清空原檔案內容。
fp =
open
('te.txt'
,mode=
'a',encoding=
'utf-8'
)fp.write(
",大象席地而坐"
)fp.close(
)#執行結果:
把大象塞進去大象覺得有點冷,大象席地而坐
r+ w+ a+ :可讀可寫
在平時工作中,我們只單純使用r/w/a,要麼唯讀,要麼只寫,一般不用可讀可寫的模式。
a = b'1234'
print
(a ,
type
(a))
strvar =
"我愛你"
# encode 編碼 -> 變成二進位制位元組流
res = strvar.encode(
"utf-8"
)print
(res ,
type
(res)
)# decode 解碼 =>二進位制位元組流恢復成原來的字串
res2 = res.decode(
"utf-8"
)print
(res2 ,
type
(res2)
)執行結果:
b'1234'
<
class
'bytes'
>
b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
<
class
'bytes'
>
我愛你 <
class
'str'
>
由此出現了乙個新問題,如果我們操作的檔案不是文字的話,那麼意味著我們讀寫的時候是不用字元編碼這種形式的。
t模式(文字模式),上述我們直接寫r w a,指的就是 rt wt at。
b模式(二進位制模式):
讀寫檔案都是以bytes/二進位制為單位的
可以針對所有檔案
fp1 =
open
('changze.png'
,mode=
'rb'
)data = fp1.read(
)fp2 =
open
('majiang.png'
,mode=
'wb'
)fp2.write(data)
執行結果:
把changze.png的複製了張取名majiang.png
close 檔案關閉的意義
重新整理緩衝區 flush
當檔案關閉的時候自動重新整理緩衝區
當整個程式執行結束的時候自動重新整理緩衝區
當緩衝區寫滿了 會自動重新整理緩衝區
手動重新整理緩衝區
手動把緩衝區裡面的內容寫入檔案當中 fp.flush()
python中有一種形式來自動關閉檔案:
with
open
('te.txt'
,mode=
'r',encoding =
'utf-8'
)as fp:
fp.read(
)pass
但是如果乙個檔案在整個程式執行週期都處於開啟方式的話,比如日之檔案,用上述方法顯然是不合理的。
讀操作
f.read(num)
# 讀取所有內容,執行完該操作後,檔案指標會移動到檔案末尾,是
#乙個整形數值,表示我們一次性讀入的字元數。
f.readline(
)# 讀取一行內容,游標移動到第二行首部引數 > 當前行字元總個數 => 以當前行讀取
#引數 < 當前行字元總個數 => 以引數的大小來讀取字元的個數
預設readline 讀取一行
f.readlines(
)# 讀取每一行內容,存放於列表中,返回的結果是乙個列表。
檔案物件 fp 也是乙個 可迭代物件 在遍歷檔案物件的時候,預設一次拿一行
強調:
f.read() 與*f.readlines()*都是將內容一次性讀入內容,如果內容過大會導致記憶體溢位,若還想將內容全讀入記憶體,則必須分多次讀入。
其他函式
readable() 功能: 判斷檔案物件是否可讀
writable() 功能: 判斷檔案物件是否可寫
fp =
open
('te.txt'
,mode=
'r',encoding=
'utf-8'
)res1 = fp.readable(
)print
(res1)
res2 = fp.writable(
)print
(res2)
執行結果:
true
false
writelines()功能:將內容是字串的可迭代性資料寫入檔案中 引數:內容為字串型別的可迭代資料。
可迭代型資料(容器型別資料,range物件,迭代器)
truncate()功能: 把要擷取的字串提取出來,然後清空內容將提取的字串重新寫入檔案中 (位元組)。
fp =
open
('te.txt'
,mode=
'r+'
,encoding=
'utf-8'
)fp.truncate(10)
執行結果:
原本內容為:hello, world!
現在成為:
hello ,wor
Python讀寫檔案模式
1 r 開啟唯讀檔案,該檔案必須存在。2 r 開啟可讀寫的檔案,該檔案必須存在。3 w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。4 w 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。5 a 以附加的方式開啟只...
python檔案讀寫模式解析
一 關於open 模式 w 以寫方式開啟,a 以追加模式開啟 從 eof 開始,必要時建立新檔案 r 以讀寫模式開啟 w 以讀寫模式開啟 參見 w a 以讀寫模式開啟 參見 a rb 以二進位制讀模式開啟 wb 以二進位制寫模式開啟 參見 w ab 以二進位制追加模式開啟 參見 a rb 以二進位制...
Python檔案讀寫常見用法總結
usr bin env python coding utf 8 檔案讀取三步驟 1.開啟檔案 f open file,mode r buffering none,encoding none,errors none,newline none,closefd true mode r,w,a,b,2.操作...