python file.seek() 檔案指標
轉自 http://www.cnblogs.com/blogCblog/p/5597973.html
當我們讀取檔案內容時,並不能重複的讀取,比如一個blogCblog.txt檔案裡有blogCblog內容,用兩個read()方法讀取blogCblog.txt的內容,會發現,第一個返回檔案內容,第二個返回‘’。並不能重複讀取,如果我想重複讀取呢?怎麼解決。
其實這跟檔案指標有關,當我們對檔案操作時,檔案內部會有一個檔案指標來定位當前位置,如圖:
當open時檔案指標是在初始位置1,當讀取4個位元組內容是檔案指標位置就在4,再write時,檔案指標從4移到8,所以,只要控制了檔案指標,就能重複的讀取了!
操作檔案指標可以通過seek方法:
seek(offset, whence):移動檔案指標
offset:偏移量,可為負數
whence:偏移相對位置
偏移相對位置為os模組當中的SEEK_SET、SEEK_CUR、SEEK_END:
os.SEEK_SET:表示檔案的相對起始位置
os.SEEK_CUR:表示檔案的相對當前位置
os.SEEK_END:表示檔案的相對結束位置
來看下例項程式碼(一個blogCblog.txt檔案裡有blogCblog內容):
1 f = open('blogCblog.txt') #首先先建立一個檔案物件 2 print f.read(3) #用read()方法讀取並列印 3 print f.tell() #打印出檔案指標的位置 4 f.close() #關閉檔案 5 6 #列印結果:blo 7 # 3
上面可以看到用read(3)讀取3個位元組的內容,而tell()方法返回檔案指標的位置。下面來操作檔案指標:
1 import os #匯入os模組 2 f = open('blogCblog.txt') #首先先建立一個檔案物件,開啟方式為w 3 print f.read(3) #用read()方法讀取並列印 4 print f.tell() #打印出檔案指標的位置 5 f.seek(0, os.SEEK_SET) #用seek()方法操作檔案指標(把檔案指標移到檔案起始位置並移動0) 6 print f.read(3) #用read()方法再次讀取並列印 7 print f.tell() #打印出檔案指標的位置 8 f.close() #關閉檔案 9 10 #列印結果:blo 11 # 3 12 # blo 13 # 3
上面的程式碼就重複讀取了,如果把第五行註釋掉,那麼第6、7行程式碼列印的結果為gCb和6,這是因為檔案指標在第3,當再次讀取時就在當前的檔案指標向後移,這也就是為什麼readline()會記住讀取位置的原因了。而第5行程式碼的作用就是把檔案指標移到初始位置!就實現了重複讀取。
當你移到指標時,偏移量大於字串長度時就會報IOError,需要注意!