Python seek 和 tell 的用法

文摘   科技   2024-10-29 08:08   上海  

点击蓝字,关注山海摸鱼人

目录:

  1. 文件指针与位置
  2. tell() 函数
  3. 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(61)
print(f.tell())  # 输出: 13
print(f.read(3).decode('utf8'))  # 输出: 人

# 将文件指针从文件结尾,向前移动到距离 3 个字节的位置
f.seek(-32)
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 错误。

山海摸鱼人
致力于记录美好之瞬间,追寻美好之明天。
 最新文章