Python文件處理之文件指針

當(dāng)我們讀取文件內(nèi)容時(shí),并不能重復(fù)的讀取,比如一個(gè)blogCblog.txt文件里有blogCblog內(nèi)容,用兩個(gè)read()方法讀取blogCblog.txt的內(nèi)容,會(huì)發(fā)現(xiàn),第一個(gè)返回文件內(nèi)容,第二個(gè)返回‘’。并不能重復(fù)讀取,如果我想重復(fù)讀取呢?怎么解決。

其實(shí)這跟文件指針有關(guān),當(dāng)我們對(duì)文件操作時(shí),文件內(nèi)部會(huì)有一個(gè)文件指針來(lái)定位當(dāng)前位置,如圖:

當(dāng)open時(shí)文件指針是在初始位置1,當(dāng)讀取4個(gè)字節(jié)內(nèi)容是文件指針位置就在4,再write時(shí),文件指針從4移到8,所以,只要控制了文件指針,就能重復(fù)的讀取了!

操作文件指針可以通過(guò)seek方法:

seek(offset, whence):移動(dòng)文件指針

offset:偏移量,可為負(fù)數(shù)

whence:偏移相對(duì)位置

偏移相對(duì)位置為os模塊當(dāng)中的SEEK_SET、SEEK_CUR、SEEK_END:

os.SEEK_SET:表示文件的相對(duì)起始位置

os.SEEK_CUR:表示文件的相對(duì)當(dāng)前位置

os.SEEK_END:表示文件的相對(duì)結(jié)束位置

來(lái)看下實(shí)例代碼(一個(gè)blogCblog.txt文件里有blogCblog內(nèi)容):

1 f = open('blogCblog.txt')  #首先先創(chuàng)建一個(gè)文件對(duì)象
2 print f.read(3)  #用read()方法讀取并打印
3 print f.tell()  #打印出文件指針的位置
4 f.close()  #關(guān)閉文件
5 
6 #打印結(jié)果:blo
7 #         3

上面可以看到用read(3)讀取3個(gè)字節(jié)的內(nèi)容,而tell()方法返回文件指針的位置。下面來(lái)操作文件指針:

1 import os  #導(dǎo)入os模塊
 2 f = open('blogCblog.txt')  #首先先創(chuàng)建一個(gè)文件對(duì)象,打開(kāi)方式為w
 3 print f.read(3)  #用read()方法讀取并打印
 4 print f.tell()  #打印出文件指針的位置
 5 f.seek(0, os.SEEK_SET)  #用seek()方法操作文件指針(把文件指針移到文件起始位置并移動(dòng)0)
 6 print f.read(3)  #用read()方法再次讀取并打印
 7 print f.tell()  #打印出文件指針的位置
 8 f.close()  #關(guān)閉文件
 9 
10 #打印結(jié)果:blo
11 #         3
12 #        blo
13 #         3

上面的代碼就重復(fù)讀取了,如果把第五行注釋掉,那么第6、7行代碼打印的結(jié)果為gCb和6,這是因?yàn)槲募羔樤诘?,當(dāng)再次讀取時(shí)就在當(dāng)前的文件指針向后移,這也就是為什么readline()會(huì)記住讀取位置的原因了。而第5行代碼的作用就是把文件指針移到初始位置!就實(shí)現(xiàn)了重復(fù)讀取。

當(dāng)你移到指針時(shí),偏移量大于字符串長(zhǎng)度時(shí)就會(huì)報(bào)IOError,需要注意!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容