檔案:資料持久化最簡單的型別,也叫平面檔案(flat file)。它僅僅是乙個檔名下的位元組流,把資料從乙個檔案讀入記憶體,然後從記憶體寫入檔案。
讀乙個檔案之前需要開啟它,之後可以呼叫函式來讀寫資料,最後需要關閉檔案。
fileobj = open(filename,mode)
fileobj 是open()返回的檔案物件;
filename 是該檔案的字串名;
mode 是指明檔案型別和操作的字串;
mode的第乙個字母表明對其的操作:
r 表示讀模式
w 表示寫模式。如果檔案不存在則新建立,如果存在則重寫新內容
x 表示檔案不存在的情況下新建立並寫檔案
a 表示如果檔案存在,在檔案末尾追加寫內容
mode 的第二個字母是檔案型別:
t (或省略)代表文字型別
b 代表二進位制檔案
>>>poem="""there was a young lady named bright,\
whose speed was far faster than light;\
she started one day \
in a relative way,\
and returned on the previous night."""
>>> len(poem)
167>>> fout = open('relativity','wt') #檔案預設放在python的根目錄下d:\python3
>>> fout.write(poem)
167>>> fout.close()
>>> fout = open('relativity1','wt')
>>> print(poem,file=fout) # 169 print()缺省會在每個引數後新增空格,在每行結束處新增換行。它在檔案relativity1中預設新增了乙個換行。
>>> fout.close()
使用如下引數,保證print()與write()有同樣的輸出:
sep分隔符:預設是乙個空格 『 『
end 結束字元:預設是乙個換行符 『\n』
>>> fout = open('relativity2','wt')
>>> print(poem,file=fout,sep='',end='') #167
>>> fout.close()
>>>
如果源字串非常大,可將資料分塊,直到所有字元被寫入:
>>> fout = open('relativity3','wt')
>>> size = len(poem)
>>> offset = 0
>>> chunk = 100
>>> while true:
if offset > size:
break
fout.write(poem[offset:offset+chunk])
offset+=chunk
10067
>>> fout.close()
如果『relativity』檔案已經存在,可使用模式x 避免重寫檔案,還可加入乙個異常處理:
>>> try:
fout = open(『relativity』,』xt』)
fout.write(『stomp stomp stomp』)
except fileexistserror:
print(『relativity already exists!. that was a close one.』)
>>> fin = open('relativity','rt')
>>> poem = fin.read()
>>> fin.close()
>>> len(poem)
167>>>
可設定最大的讀入字元數限制read()函式一次返回的大小,然後把每一塊拼接成原來的字串
>>> poem=''
>>> fin = open('relativity','rt')
>>> chunk = 100
>>> while true:
fragment = fin.read(chunk) #read會記住已讀取得位置
if not fragment: # 讀到檔案結尾之後,再次呼叫read()會返回空字串(『』),if not fragment條件被判為false
break
poem += fragment
>>> fin.close()
>>> len(poem)
167
也可使用readline()每次讀入檔案的一行,通過追加每一行拼接成原來的字串poem:
>>> poem = ''
>>> fin = open('relativity','rt')
>>> while true:
line = fin.readline() #對乙個文字檔案,即使空行也有1個字元長度(換行字元』\n』)
if not line: #當line非空時,返回true,當檔案讀取結束,readline()返回空字串,返回為false
break
poem += line
>>> fin.close()
>>> len(poem)
167
讀取文字檔案最簡單的方式是使用乙個迭代器(iterator),它會每次返回一行。
>>> poem = ''
>>> fin = open('relativity','rt')
>>> for line in fin:
poem += line
>>> fin.close()
>>> len(poem)
167>>>
函式readlines()呼叫時每次讀取一行,並返回單行字串的列表。
如果檔案模式字串中包含』b』,那麼檔案會以二進位制模式開啟,這種情況下,讀寫的是位元組而不是字串。
>>> bdata = bytes(range(0,256))
>>> len(bdata)
256>>> fout = open('bfile','wb')
>>> fout.write(bdata)
256>>> fout.close()
>>> fin = open('bfile','rb')
>>> bdata = fin.read()
>>> len(bdata)
256>>> fin.close()
使用with自動關閉檔案
忘記關閉已開啟的檔案,函式結束時會被關掉。python的上下文管理器(context manager)會清理一些資源,例如開啟的檔案,應該強制剩下的所有寫操作完成後再關閉檔案。它的形式為:with expression as variable:
>>> with open(『relativity』,』wt』) as fout:
fout.write(poem)
完成上下文管理器的**後,檔案會被自動關閉
使用seek()改變位置
函式tell()返回距離檔案開始處的位元組偏移量,函式seek()允許跳轉到檔案其他位元組偏移量的位置。
>>> fin = open('bfile','rb')
>>> fin.tell()
0>>> fin.seek(255)
255
用第二個引數呼叫函式seek():seek(offset,origin)
如果origin等於0(預設為0),從開頭偏移offset個位元組;
如果origin等於1,從當前位置處偏移offset個位元組;
如果origin等於2,距離最後結尾處偏移offset個位元組;
這些值也在標準os模組中被定義:
>>> os.seek_set
0>>> os.seek_cur
1>>> os.seek_end
2
Python檔案輸入輸出
本文以.txt檔案為例,說明python從.txt檔案中讀取內容和向.txt檔案寫入內容的方法。a.txt檔案內容 犬吠水聲中,桃花帶雨濃。樹深時見鹿,溪午不聞鐘。野竹分青靄,飛泉掛碧峰。無人知所去,愁倚兩三松。讀取檔案 open filename,mode open返回乙個檔案物件。第乙個引數是乙...
python 檔案輸入輸出
我們開啟乙個檔案,並使用乙個物件來表示該檔案 f open 檔名,模式 f open f.txt 文字形式 唯讀模式 預設值 f open f.txt rt 文字形式 唯讀模式 同預設值 f open f.txt w 文字形式 覆蓋寫模式 f open f.txt a 文字形式 追加寫模式 讀檔案 ...
python 檔案的輸入輸出
一 檔案內建函式open 和 file 作為開啟檔案之門的 鑰匙 內建函式 open 以及 file 提供了初始化輸入 輸出 i o 操作的通用介面。open 內建函式成功開啟檔案後時候會返回乙個檔案物件,否則引發乙個錯誤.當操作失敗,python 會產生乙個 ioerror 異常。1 open 的...