今天寫socket傳輸大文件時, 發現了兩個文件處理的神方法, seek(), 下面來介紹一下seek, 可以結合指針來理解
seek用法:就是定義指針類型。 seek(v1, v2):參數v1表示跨度是多少, 參數v2代表起始位置, 只能有三個參數:0,代表從文件最開始位置開始;1,表示從每次當前位置開始,2,表示從文件最後數據開始。
下面先來一段代碼, 通過代碼進行講解
data3.txt中數據: AAABBBCCCDDDEEEFFFSSS
f = open('data3.txt', 'rb') # 從文件初始位置開始, 偏移量爲0, 也就是從文件第一個字符開始 f.seek(0, 0) data1 = f.read(4) data2 = f.read(4) print(data1) print(data2)
爲什麼data1是AAAB, data2中是BBCC呢?
f.tell()就是可以打印出當前指針所在的位置
首先 f.seek(0, 0): 定義指針: 指針初始位置只想文件數據最開始的位置, 偏移量是0. 指針開始位置就是文件數據最開始, 也就是第一個A, 然後data1 = f.read(4)讀取了4個數據之後, 指針到達了第二個B的位置, 所以data2 = f.read()的時候, 指針已經移動到了第二個B的位置, 再接着讀取4個字符就是BBCC
ps:因爲我們之前沒有讀取數據, 從頭打開文件讀取數據, 所以當前位置也是文件數據最開始, 即第一個A, 所以在這裏f.seek(0, 0)和f.seek(0, 1)其實是一樣的,
下面來看看他倆不一樣的地方:
f = open('data3.txt', 'rb') f.seek(0, 0) data1 = f.read(4) data2 = f.read(4) print(data1) print(data2) f.seek(2, 1) data3 = f.read(4) print(data3) f.seek(2, 0) data4 = f.read(4) print(data4)
在第七行我們接着上面的重新定義一下指針, f.seek(2, 1) 。 這次的指針, 起始位置就是當前指針的位置, 偏移量是2。 由上一個代碼和圖我們看出, 這段代碼的前6行的執行會讓指針停在第二個C的位置, 然後我們重新定義的指針起始位置就是當前位置, 偏移量是2, 所以data3 = f.read(4) 就是從當前位置下一個字符開始算起,即第三個C處先向後偏移兩個字符, 再取4個字符, 所以就是data3的數據就是DDEE
最後第十行我們又重新定義了指針,f.seek(2, 0), 也就是說我們又重新把指針定義爲文件數據的起始位置, 偏移量是2。 雖然這段代碼的前9行會讓指針停在第二個D的位置, 但是我們重新定義了之後嗎指針就只想文件數據最開始的位置了, 然後偏移兩個數據再取4個字符就是ABBB了