python seek tell_PYTHON学习14.09:Python seek()和tell()函数详解
在講解 seek() 函數和 tell() 函數之前,首先來了解一下什么是文件指針。
我們知道,使用 open() 函數打開文件并讀取文件中的內容時,總是會從文件的第一個字符(字節)開始讀起。那么,有沒有辦法可以自定指定讀取的起始位置呢?答案是肯定,這就需要移動文件指針的位置。
文件指針用于標明文件讀寫的起始位置。假如把文件看成一個水流,文件中每個數據(以 b 模式打開,每個數據就是一個字節;以普通模式打開,每個數據就是一個字符)就相當于一個水滴,而文件指針就標明了文件將要從文件的哪個位置開始讀起。圖 1 簡單示意了文件指針的概念。
圖 1 文件指針概念示意圖
可以看到,通過移動文件指針的位置,再借助 read() 和 write() 函數,就可以輕松實現,讀取文件中指定位置的數據(或者向文件中的指定位置寫入數據)。
注意,當向文件中寫入數據時,如果不是文件的尾部,寫入位置的原有數據不會自行向后移動,新寫入的數據會將文件中處于該位置的數據直接覆蓋掉。
實現對文件指針的移動,文件對象提供了 tell()?函數和 seek()?函數。tell() 函數用于判斷文件指針當前所處的位置,而 seek() 函數用于移動文件指針到文件的指定位置。
tell() 函數
tell() 函數的用法很簡單,其基本語法格式如下:
file.tell()
其中,file 表示文件對象。
例如,在同一目錄下,編寫如下程序對 a.txt 文件做讀取操作,a.txt 文件中內容為:
http://c.biancheng.net
讀取 a.txt 的代碼如下:
f = open("a.txt",'r')
print(f.tell())
print(f.read(3))
print(f.tell())
運行結果為:
0
htt
3
可以看到,當使用 open() 函數打開文件時,文件指針的起始位置為 0,表示位于文件的開頭處,當使用 read() 函數從文件中讀取 3 個字符之后,文件指針同時向后移動了 3 個字符的位置。這就表明,當程序使用文件對象讀寫數據時,文件指針會自動向后移動:讀寫了多少個數據,文件指針就自動向后移動多少個位置。
seek()函數
seek() 函數用于將文件指針移動至指定位置,該函數的語法格式如下:
file.seek(offset[, whence])
其中,各個參數的含義如下:
file:表示文件對象;
whence:作為可選參數,用于指定文件指針要放置的位置,該參數的參數值有 3 個選擇:0 代表文件頭(默認值)、1 代表當前位置、2 代表文件尾。
offset:表示相對于 whence 位置文件指針的偏移量,正數表示向后偏移,負數表示向前偏移。例如,當whence == 0?&&offset == 3(即 seek(3,0) ),表示文件指針移動至距離文件開頭處 3 個字符的位置;當whence == 1?&&offset == 5(即 seek(5,1) ),表示文件指針向后移動,移動至距離當前位置 5 個字符處。
注意,當 offset 值非 0 時,Python 要求文件必須要以二進制格式打開,否則會拋出 io.UnsupportedOperation 錯誤。
下面程序示范了文件指針操作:
f = open('a.txt', 'rb')
# 判斷文件指針的位置
print(f.tell())
# 讀取一個字節,文件指針自動后移1個數據
print(f.read(1))
print(f.tell())
# 將文件指針從文件開頭,向后移動到 5 個字符的位置
f.seek(5)
print(f.tell())
print(f.read(1))
# 將文件指針從當前位置,向后移動到 5 個字符的位置
f.seek(5, 1)
print(f.tell())
print(f.read(1))
# 將文件指針從文件結尾,向前移動到距離 10 個字符的位置
f.seek(-1, 2)
print(f.tell())
print(f.read(1))
運行結果為:
0
b'h'
1
5
b'/'
11
b'a'
21
b't'
注意:由于程序中使用 seek() 時,使用了非 0 的偏移量,因此文件的打開方式中必須包含 b,否則就會報?io.UnsupportedOperation 錯誤,有興趣的讀者可自定嘗試。
上面程序示范了使用 seek() 方法來移動文件指針,包括從文件開頭、指針當前位置、文件結尾處開始計算。運行上面程序,結合程序輸出結果可以體會文件指針移動的效果。
總結
以上是生活随笔為你收集整理的python seek tell_PYTHON学习14.09:Python seek()和tell()函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac 硬盘未推出 硬盘无法读取_在Ma
- 下一篇: java解决策略膨胀_折腾Java设计模