檔案:資料持久化最簡單的型別,也叫平面檔案(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
python3輸入輸出
模 式 描 述 r以唯讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。rb以二進位制格式開啟乙個檔案用於唯讀。檔案指標將會放在檔案的開頭。這是預設模式。r 開啟乙個檔案用於讀寫。檔案指標將會放在檔案的開頭。rb 以二進位制格式開啟乙個檔案用於讀寫。檔案指標將會放在檔案的開頭。w開啟乙個檔...
Python3 輸入輸出筆記
encoding utf 8 有多組輸入資料,但組數不確定 while true try a,b map int,input split 以空格隔開 print a b map int,list 把每個list的元素轉為int型 except eoferror 捕捉異常 break 先輸入乙個整數,...
Python3 輸入和輸出(二)
接上一節 1.讀寫檔案的模式圖 將字串寫入到檔案 foo.txt 中 usr bin python3 開啟乙個檔案 f open tmp foo.txt w f.write python 是乙個非常好的語言。n是的,的確非常好 n 關閉開啟的檔案 f.close 開啟檔案 foo.txt,顯示如下 ...