當(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,需要注意!