这是我参与2022首次更文挑战的第10天,活动详情查看2022首次更文挑战
seek() 方法用于移动文件读取指针到指定位置。 例如:从文件xx开始读取xx位做md5校验判断,
语法: fileObject.seek(offset[, whence])
参数解析:
- offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
- whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
返回值: 成功,返回新的文件位置,失败,则函数返回 -1。
例子:
f = open('test', 'rb+')
f.write('0123456789')
f.seek(3) # 从文件开头移动三位 即到第三个字节后 此时whence默认为0 意等于f.seek(3,0)
此时指针在光标处
f.read(1) # 读出一位
# b'3'
f.seek(-3, 2) # 从文件末尾开始移动负三位 即是倒数第三个字节
此时指针在光标处
f.read(1) # 读出一位
# b'7'
适用场景也比较广泛,例如用于大文件的md5检测,对于大文件(如系统镜像文件)而言,如何校验我们下载到本地的文件与作者上传的文件相同呢?常规的方法就是检测md5值是否相同,但是对于像windows这中动则几G十几G的镜像,很难整个去教研md5,那么此时就可用f.seek()来进行处理。
思路就是,读取文件的前2500个字节和倒数2500个字节生成md5进行校验
filepath = "./data.file"
check_data = []
with open(filepath, 'rb') as fd:
if os.path.getsize(filepath) < 2500:
check_data.append(str(fd.read()))
else:
fd.seek(0, os.SEEK_SET)
check_data.append(str(fd.read(1000)))
fd.seek(-1000, os.SEEK_END)
check_data.append(str(fd.read(1000)))
data = "".join(val)
md5_info = {filepath: generate_md5(data)}