目录:
文件指针与位置 tell()
函数seek()
函数
文件指针与位置
在 Python 中,当你使用 open()
函数打开文件并读取文件中的内容时,默认情况下会从文件的第一个字节开始读起。
文件指针用于标明文件读写的起始位置。假如把文件看成一个水流,文件中每个数据(以 b
模式打开,每个数据就是一个字节;以普通模式打开,每个数据就是一个字符,但一个字符是1或多个字节),每个字节就相当于一个水滴,而文件指针就标明了文件将要从文件的哪个位置开始读起。下图简单示意了文件指针的概念。
可以看到,通过移动文件指针的位置,再借助 read()
和 write()
函数,就可以轻松实现读取文件中指定位置的数据(或者向文件中的指定位置写入数据)。
当向文件中写入数据时,如果不是文件的尾部,写入位置的原有数据不会自行向后移动,新写入的数据会将文件中处于该位置的数据直接覆盖掉。
tell()
函数
tell()
函数用于判断文件指针当前所处的位置,其基本语法格式如下:
file.tell()
其中,file
表示文件对象。tell()函数
返回的是字节偏移量,而不是字符数。
示例代码
假设 a.txt
文件的内容为:
山海 摸鱼人 在这里。
这是一个测试文件。
读取 a.txt
文件的代码如下:
# 打开文件
f = open("a.txt", 'r', encoding='utf8')
print(f.tell()) # 输出: 0
print(f.read(3), end='.') # 输出: 山海 .
print(f.tell()) # 输出: 7
# 关闭文件
f.close()
可以看到,当使用 open()
函数打开文件时,文件指针的起始位置为 0
,表示位于文件的开头处。当使用 read()
函数从文件中读取 3 个字符之后,文件指针同时向后移动了 3 个字符( 7 个字节)的位置。
这就表明,当程序使用文件对象读写数据时,文件指针会自动向后移动:读写了多少个字节
,文件指针就自动向后移动多少个位置
。
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 个字节处。
示例代码
假设 a.txt
文件的内容为:
山海 摸鱼人 在这里。
这是一个测试文件。
使用 seek()
方法来移动文件指针的代码如下:
# 以二进制模式打开文件
f = open('a.txt', 'rb')
# 判断文件指针的位置
print(f.tell()) # 输出: 0
# 读取3个字节,文件指针自动后移1个中文汉字
print(f.read(3).decode('utf8')) # 输出: 山
print(f.tell()) # 输出: 3
# 将文件指针从文件开头,向后移动到 6 个字节的位置
f.seek(6)
print(f.tell()) # 输出: 6
print(f.read(1)) # 输出: b' '
# 将文件指针从当前位置,向后移动到 6 个字节的位置
f.seek(6, 1)
print(f.tell()) # 输出: 13
print(f.read(3).decode('utf8')) # 输出: 人
# 将文件指针从文件结尾,向前移动到距离 3 个字节的位置
f.seek(-3, 2)
print(f.tell()) # 输出: 55
print(f.read(3).decode('utf8')) # 输出: 。
# 关闭文件
f.close()
运行结果为:
0
山
3
6
b' '
13
人
55
。
这里的中文字符占 3 个字节。
注意:由于程序中使用 seek()
时,使用了非 0 的whence
,因此文件的打开方式中必须包含 b
,否则就会报 io.UnsupportedOperation: can't do nonzero cur-relative seeks
错误。