Python seek()和tell()函數(shù)的具體使用
在講解 seek() 函數(shù)和 tell() 函數(shù)之前,首先來了解一下什么是文件指針。
我們知道,使用 open() 函數(shù)打開文件并讀取文件中的內(nèi)容時,總是會從文件的第一個字符(字節(jié))開始讀起。那么,有沒有辦法可以自定指定讀取的起始位置呢?答案是肯定,這就需要移動文件指針的位置。
文件指針用于標明文件讀寫的起始位置。假如把文件看成一個水流,文件中每個數(shù)據(jù)(以 b 模式打開,每個數(shù)據(jù)就是一個字節(jié);以普通模式打開,每個數(shù)據(jù)就是一個字符)就相當于一個水滴,而文件指針就標明了文件將要從文件的哪個位置開始讀起。圖 1 簡單示意了文件指針的概念。

圖 1 文件指針概念示意圖
可以看到,通過移動文件指針的位置,再借助 read() 和 write() 函數(shù),就可以輕松實現(xiàn),讀取文件中指定位置的數(shù)據(jù)(或者向文件中的指定位置寫入數(shù)據(jù))。
注意,當向文件中寫入數(shù)據(jù)時,如果不是文件的尾部,寫入位置的原有數(shù)據(jù)不會自行向后移動,新寫入的數(shù)據(jù)會將文件中處于該位置的數(shù)據(jù)直接覆蓋掉。
實現(xiàn)對文件指針的移動,文件對象提供了 tell() 函數(shù)和 seek() 函數(shù)。tell() 函數(shù)用于判斷文件指針當前所處的位置,而 seek() 函數(shù)用于移動文件指針到文件的指定位置。
tell() 函數(shù)
tell() 函數(shù)的用法很簡單,其基本語法格式如下:
file.tell()
其中,file 表示文件對象。
例如,在同一目錄下,編寫如下程序?qū)?a.txt 文件做讀取操作,a.txt 文件中內(nèi)容為:
http://csdn.net
讀取 a.txt 的代碼如下:
f =open("a.txt",'r')
print(f.tell())
print(f.read(3))
print(f.tell())
運行結(jié)果為:
0
htt
3
可以看到,當使用 open() 函數(shù)打開文件時,文件指針的起始位置為 0,表示位于文件的開頭處,當使用 read() 函數(shù)從文件中讀取 3 個字符之后,文件指針同時向后移動了 3 個字符的位置。這就表明,當程序使用文件對象讀寫數(shù)據(jù)時,文件指針會自動向后移動:讀寫了多少個數(shù)據(jù),文件指針就自動向后移動多少個位置。
seek()函數(shù)
seek() 函數(shù)用于將文件指針移動至指定位置,該函數(shù)的語法格式如下:
file.seek(offset[, whence])
其中,各個參數(shù)的含義如下:
- file:表示文件對象;
- whence:作為可選參數(shù),用于指定文件指針要放置的位置,該參數(shù)的參數(shù)值有 3 個選擇:0 代表文件頭(默認值)、1 代表當前位置、2 代表文件尾。
- offset:表示相對于 whence 位置文件指針的偏移量,正數(shù)表示向后偏移,負數(shù)表示向前偏移。例如,當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())
# 讀取一個字節(jié),文件指針自動后移1個數(shù)據(jù)
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))
# 將文件指針從文件結(jié)尾,向前移動到距離 2 個字符的位置
f.seek(-1,2)
print(f.tell())
print(f.read(1))運行結(jié)果為:
0
b'h'
1
5
b'/'
11
b'a'
21
b't'
————————————————
到此這篇關(guān)于Python seek()和tell()函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)Python seek() tell()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何用python將文件夾內(nèi)多個excel表格合并成總表
前幾天遇見這么一個問題,手上有很多張表格,這些表格中都只有一個sheet,需要把這些表匯總到一張表,下面這篇文章主要給大家介紹了關(guān)于如何用python將文件夾內(nèi)多個excel表格合并成總表的相關(guān)資料,需要的朋友可以參考下2023-06-06
python使用pip成功導(dǎo)入庫后還是報錯的解決方法(針對vscode)
最近在學(xué)爬蟲,但在使用Scrapy包時,在終端通過pip裝好包以后,在pycharm中導(dǎo)入包時,依然會報錯,下面這篇文章主要給大家介紹了關(guān)于python使用pip成功導(dǎo)入庫后還是報錯的解決方法,需要的朋友可以參考下2022-07-07
TensorFlow深度學(xué)習之實現(xiàn)合并與分割的示例代碼
這篇文章主要為大家詳細介紹了TensorFlow中實現(xiàn)合并與分割的四位函數(shù)以及它們的用法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-07-07
Python爬蟲之使用BeautifulSoup和Requests抓取網(wǎng)頁數(shù)據(jù)
這篇文章主要介紹了Python爬蟲之使用BeautifulSoup和Requests抓取網(wǎng)頁數(shù)據(jù),本篇文章將介紹如何使用 Python 編寫一個簡單的網(wǎng)絡(luò)爬蟲,從網(wǎng)頁中提取有用的數(shù)據(jù),需要的朋友可以參考下2023-04-04
提升Python項目整潔度使用import?linter實例探究
在復(fù)雜的Python項目中,良好的代碼組織結(jié)構(gòu)是維護性和可讀性的關(guān)鍵,本文將深入研究?import-linter?工具,它是一個強大的靜態(tài)分析工具,旨在優(yōu)化項目的模塊導(dǎo)入,提高代碼質(zhì)量和可維護性2024-01-01
將FileStorage對象高效轉(zhuǎn)換為NumPy數(shù)組的兩種實現(xiàn)方案
在Web開發(fā)(如Flask應(yīng)用)中,處理用戶上傳的圖片文件時,常會遇到FileStorage對象向numpy.ndarray的轉(zhuǎn)換需求,本文將提供兩種經(jīng)過驗證的高效方法,并深入解析其技術(shù)細節(jié)與適用場景,需要的朋友可以參考下2025-03-03

