Python3 文件f.seek() 方法

214 阅读2分钟

这是我参与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)}