今天写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了