1. 程式人生 > >python file.seek() 檔案指標

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