[TOC]
文件處理
流程
- 打開文件
open()
f = open(filename,mode = '') - 操作文件
- 關(guān)閉文件
close()
模式:
常用模式
以下這三種模式,和+模式相比,就是+號(hào)模式可以讀寫文件,而這里的模式只能讀或者寫
r:如果未制定mode,默認(rèn)為‘r’模式
w:只寫,會(huì)把原先存在的文件覆蓋,如果制定文件不存在,會(huì)創(chuàng)建文件
a:追加模式,寫數(shù)據(jù)的時(shí)候,會(huì)自動(dòng)添加到(已存)文件的末尾
如果在a模式下,需要在文件中添加一段內(nèi)容,但是不是在末尾,a模式是否可以用?
字節(jié)模式(二進(jìn)制操作):
rb wb ab
獲取字節(jié)數(shù)據(jù),不需要進(jìn)行解碼,但在寫入數(shù)據(jù)的時(shí)候,需要對(duì)數(shù)據(jù)(二進(jìn)制)進(jìn)行制定編碼
范例代碼:
>>> s = 'this is a test'
>>> b = bytes(s,encoding = 'utf-8')
>>>
>>> f = open('test.txt','w')
>>> f.write(s)
14
>>> f = open('test.txt','wb')
>>> f.write(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
>>> f = open('test.txt','wb')
>>> f.write(b)
14
上述代碼中,首先輸入的內(nèi)容s為一個(gè)str類型,b是一個(gè)將s轉(zhuǎn)制成byte類型之后的字節(jié)串
第一段代碼正常輸入字符串s
反饋回來是正常寫入文件結(jié)果:14(?為什么是14)
第二段代碼是輸入字符串s
但是文件打開方式為wb(字節(jié)串類型寫入)
反饋回來報(bào)錯(cuò):需要一個(gè)字節(jié)串類型對(duì)象,而不是str類型
第三段代碼是輸入字節(jié)串b
文件打開方式為wb
正確輸入
因此,在使用b模式的時(shí)候一定要注意傳入的數(shù)據(jù)類型。非b模式下,以字符為單位進(jìn)行讀寫,有b模式下,以字節(jié)為單位讀寫。
可讀可寫模式:
r+追加寫
默認(rèn)光標(biāo)在開始位置,寫的話一定是追加寫
相對(duì)來說最好的讀寫模式,配合seek(),tell()方法可以實(shí)現(xiàn)大部分操作w+覆蓋寫
如果要讀取,f.seek()指定光標(biāo)位置,按照字節(jié)走,如果字節(jié)讀取不全,就會(huì)報(bào)錯(cuò)
這種模式在讀寫之前都會(huì)清空文件內(nèi)容,盡量不要使用!a+追加寫
讀取內(nèi)容也需要通過seek調(diào)整,光標(biāo)默認(rèn)在文件最后位置,不論光標(biāo)位置,總是在最后位置添加
操作文件
文件是可迭代對(duì)象,按行進(jìn)行迭代
f = open(filename,mode = '')
常用文件操作方法
read():讀指定個(gè)數(shù)的字符,f.read(10)。如果打開方式有b,那么以字節(jié)為單位進(jìn)行讀取,如果沒有b,就以字符為單位進(jìn)行讀取
其中,for line in f:表示按行讀取,這個(gè)叫做文件的逐行迭代,文件是一種可以迭代類型write():根據(jù)上面的范例可以看出,如果打開方式?jīng)]有b,則接受普通字符串為參數(shù),如果有b,就需要傳入bytes類型的對(duì)象
readline():讀入一行,b模式下返回bytes類型,非b模式下返回一行字符串,可以指定數(shù)量參數(shù)
readlines():按行讀取數(shù)據(jù),并且返回的行被存在列表中,可以指定數(shù)量參數(shù)
seek():將指針指向制定的下標(biāo)處,此處要注意使用的模式,在某些模式下,指針指定在哪些位置都只能影響讀取的位置,但是寫入只能寫在固定的位置。比如w+或者是a+模式。以字節(jié)為單位進(jìn)行計(jì)數(shù)
tell():用于獲取當(dāng)前指針的位置,和seek()一樣永遠(yuǎn)以字節(jié)為單位進(jìn)行計(jì)數(shù)
flush():將剛寫入的內(nèi)容刷新到本地文件。默認(rèn)情況下,在文件關(guān)閉后,緩存內(nèi)的數(shù)據(jù)才會(huì)寫入本地文件,這樣可能會(huì)造成數(shù)據(jù)訪問不一致。
seek詳解:
seek的三種模式:
- f.seek(p,0)移動(dòng)到當(dāng)前文件第p個(gè)字節(jié)處,絕對(duì)位置
- f.seek(p,1)移動(dòng)到相當(dāng)于當(dāng)前位置后的p個(gè)字節(jié)
- f.seek(p.2)移動(dòng)到文章尾后的p個(gè)字節(jié)
with————上下文管理器
with open('test.txt','w')as f:
f.write('str')
在python2.7版本后,with支持同時(shí)打開多個(gè)文件
with open('log1') as obj1, open('log2') as obj2
with 不但能管理文件,還能管理別的對(duì)象