天天看點

seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

檢視上一節:二進制檔案

二進制檔案的讀取位置

首先來建立一個檔案,看一下讀取檔案的位置,依然使用demo.txt來展示。

#使用二進制檔案的讀取方式
with open('demo.txt','rb') as file_obj:
        print(file_obj.read())           

執行結果為:

seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

文檔前面的

b

代表它是一個二進制的字元串,但是因為類型是ASCII,是以文檔内容是以正常字元串的形式顯示出來的。怎麼驗證呢,可以加一個位置索引,讀取指定位置的字元,此時顯示的就是一個數字了,如下:

with open('demo.txt','rb') as file_obj:
      print(file_obj.read()[0])           
seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

如果文檔裡面有中文字元的話,可以看的更加明顯,自己可以嘗試一下。

之前的課程中講過,可以加入步長,讀取的就是指定長度的内容,比如,這裡讀取前100個字元:

with open('demo.txt','rb') as file_obj:
      print(file_obj.read(100))           
seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

那麼如果我們想知道讀取到什麼位置了呢,此時就可以通過tell()方法來實作,這也是本節課講授的新知識。

tell()方法

tell() 方法用來檢視目前讀取的位置。

with open('demo.txt','rb') as file_obj:
      print(file_obj.read(100))
      print(file_obj.read(30))

     print('目前讀取到了 -->',file_obj.tell())           
seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

seek()方法

seek() 可以修改目前讀取的位置。

with open('demo.txt','rb') as file_obj:
     file_obj.seek(55)
     print('目前讀取到了 -->',file_obj.tell())           
seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

seek的用法:

seek()需要兩個參數,第一個 是要切換到的位置,第二個 計算位置方式,它的可選值為:

1、0 從頭計算,預設值

2、1 從目前位置計算

3、2 從最後位置開始計算

即先看第二個數字,假設是(x,0)則表示從文檔的開始位置切換到第x個位置,如果是(x,1)則表示切換到從目前讀取到的位置再向後x的位置開始,同理,如果是(x,2)則表示,切換到文檔的末尾再向後x的位置開始,注意,x可以是負數。

with open('demo.txt','rb') as file_obj:
     file_obj.seek(55)
      #     file_obj.seek(80,0)
      #     file_obj.seek(70,1)
      #     file_obj.seek(-10,2)
     print(file_obj.read(5))
     print('目前讀取到了 -->',file_obj.tell())           
seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

可以将上述注釋掉的代碼自己進行嘗試,深入的了解seek和tell的用法。

在文本檔案中的用法

上面講述了在二進制文檔中的用法,下面說一下在文本文檔中的用法,大體上是差不多的,但是稍微有一點差別。

首先将上述代碼複制,并修改mode的值為rt,看一下在文本檔案的效果:

with open('demo.txt','rt' ) as file_obj:
    file_obj.seek(55)#切換到55
    print(file_obj.read(10))#讀取10個字元的内容并輸出
    print('目前讀取到了 -->',file_obj.tell())           
seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

看起來是沒有問題的,但是我們再來讀取一下其他格式的文檔。比如demo2,注意修改編碼格式;

文檔内容:

seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

代碼如下:

with open('demo2.txt','rt' , encoding='utf-8') as file_obj:
    #從第三個位元組開始,一個中文是3個位元組
    file_obj.seek(3)
    print(file_obj.read())#讀取全文
    print('目前讀取到了 -->',file_obj.tell())           
seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

此時就将第一個漢字跳過了,但是在這裡注意一下,一個中文是3個位元組,如果seek裡面的第一個參數不是3的倍數,那麼将會報錯!

seek()和tell() | Python從入門到精通:高階篇之五十一二進制檔案的讀取位置tell()方法seek()方法在文本檔案中的用法

是以seek和tell也是可以用于除了ASCII之外的文檔的,但是要注意參數的位置。

點選檢視配套視訊教程

檢視更多有關Python的内容,請訂閱

Python學習站

官方技術圈!