相关文章推荐
爱吹牛的吐司  ·  Get the Current ...·  1 年前    · 
无邪的黑框眼镜  ·  torch.cuda.empty_cache ...·  1 年前    · 
Python模块和包
12 Python文件操作(I/O)
12.1 什么是文件路径,Python中如何书写文件路径?
12.2 Python绝对路径和相对路径
12.3 Python文件基本操作
12.4 Python open
12.5 以文本格式和二进制格式打开文件,到底有什么区别?
12.6 Python read
12.7 Python readline()和readlines()
12.8 Python write和writelines
12.9 Python close
12.10 Python seek和tell
12.11 Python with as
12.12 什么是上下文管理器,深入底层了解Python with as语句
12.13 Python pickle模块
12.14 Python fileinput模块:逐行读取多个文件
12.15 Python linecache模块用法:随机读取文件指定行
12.16 Python pathlib模块
12.17 Python os.path模块
12.18 Python fnmatch模块
12.19 Python使用os模块操作文件和目录
12.20 Python tempfile模块:生成临时文件和临时目录
在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针。
我们知道,使用 open() 函数打开文件并读取文件中的内容时,总是会从文件的第一个字符(字节)开始读起。那么,有没有办法可以自定指定读取的起始位置呢?答案是肯定,这就需要移动文件指针的位置。
文件指针用于标明文件读写的起始位置。假如把文件看成一个水流,文件中每个数据(以 b 模式打开,每个数据就是一个字节;以普通模式打开,每个数据就是一个字符)就相当于一个水滴,而文件指针就标明了文件将要从文件的哪个位置开始读起。图 1 简单示意了文件指针的概念。 图 1 文件指针概念示意图
可以看到,通过移动文件指针的位置,再借助 read() 和 write() 函数,就可以轻松实现,读取文件中指定位置的数据(或者向文件中的指定位置写入数据)。 注意,当向文件中写入数据时,如果不是文件的尾部,写入位置的原有数据不会自行向后移动,新写入的数据会将文件中处于该位置的数据直接覆盖掉。

实现对文件指针的移动,文件对象提供了 tell() 函数和 seek() 函数。tell() 函数用于判断文件指针当前所处的位置,而 seek() 函数用于移动文件指针到文件的指定位置。 tell() 函数 tell() 函数的用法很简单,其基本语法格式如下: file.tell()

其中,file 表示文件对象。
例如,在同一目录下,编写如下程序对 a.txt 文件做读取操作,a.txt 文件中内容为: http://c.biancheng.net

读取 a.txt 的代码如下: f = open("a.txt",'r') print(f.tell()) print(f.read(3)) print(f.tell()) 运行结果为: 可以看到,当使用 open() 函数打开文件时,文件指针的起始位置为 0,表示位于文件的开头处,当使用 read() 函数从文件中读取 3 个字符之后,文件指针同时向后移动了 3 个字符的位置。这就表明,当程序使用文件对象读写数据时,文件指针会自动向后移动:读写了多少个数据,文件指针就自动向后移动多少个位置。 seek()函数 seek() 函数用于将文件指针移动至指定位置,该函数的语法格式如下: file.seek(offset[, whence])

其中,各个参数的含义如下: file:表示文件对象; whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。 offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。例如,当 whence == 0 &&offset == 3 (即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;当 whence == 1 &&offset == 5 (即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。 注意,当 offset 值非 0 时, Python 要求文件必须要以二进制格式打开,否则会抛出 io.UnsupportedOperation 错误。

下面程序示范了文件指针操作: f = open('a.txt', 'rb') # 判断文件指针的位置 print(f.tell()) # 读取一个字节,文件指针自动后移1个数据 print(f.read(1)) print(f.tell()) # 将文件指针从文件开头,向后移动到 5 个字符的位置 f.seek(5) print(f.tell()) print(f.read(1)) # 将文件指针从当前位置,向后移动到 5 个字符的位置 f.seek(5, 1) print(f.tell()) print(f.read(1)) # 将文件指针从文件结尾,向前移动到距离 2 个字符的位置 f.seek(-1, 2) print(f.tell()) print(f.read(1)) 运行结果为: 注意:由于程序中使用 seek() 时,使用了非 0 的偏移量,因此文件的打开方式中必须包含 b,否则就会报 io.UnsupportedOperation 错误,有兴趣的读者可自定尝试。

上面程序示范了使用 seek() 方法来移动文件指针,包括从文件开头、指针当前位置、文件结尾处开始计算。运行上面程序,结合程序输出结果可以体会文件指针移动的效果。

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。内含一款搜索神器,免费下载全网书籍和视频。

微信扫码关注公众号