Python 文件 seek() 方法



Python 文件seek()方法将文件的游标设置在当前文件的指定位置。文件的游标用于存储文件读取和写入操作的当前位置;此方法可以向前或向后移动此文件游标。

例如,每当我们打开一个文件进行读取时,文件游标总是位于 0 位置。当我们遍历文件内容时,它会逐渐递增。但是,某些情况下需要从文件的特定位置读取文件。这就是此方法发挥作用的地方。

让我们看看使用 seek() 方法的各种情况:

  • 如果使用 'a' 或 'a+' 以追加模式打开文件,则在下次写入时将撤消任何 seek() 操作。
  • 如果仅使用 'a' 以追加模式打开文件进行写入,则此方法本质上是一个无操作,但对于以启用读取的追加模式(模式 'a+')打开的文件仍然有用。
  • 如果使用 't' 以文本模式打开文件,则只有 tell() 返回的偏移量才是合法的。使用其他偏移量会导致未定义的行为。
  • 所有文件对象都是可查找的。

语法

以下是 Python 文件seek()方法的语法:

fileObject.seek(offset[, whence])

参数

  • offset − 这是在文件中移动读/写指针的位置数。

  • whence − (可选)默认为 0;这意味着绝对文件定位,其他值为 1,这意味着相对于当前位置查找,2 意味着相对于文件末尾查找。

返回值

此方法不返回值。它只是将游标设置在指定的偏移量。

示例

考虑一个包含 5 行的演示文件“foo.txt”。

This is 1st line
This is 2nd line
This is 3rd line
This is 4th line
This is 5th line

以下示例显示了 Python 文件 seek() 方法的用法。我们试图将指针设置在文件的开头。因此,我们将偏移量参数传递给此方法为 0。

# Open a file
fo = open("foo.txt", "r+")
print("Name of the file: ", fo.name)

# Assuming file has following 5 lines
# This is 1st line
# This is 2nd line
# This is 3rd line
# This is 4th line
# This is 5th line

line = fo.readline()
print("Read Line:", line)

# Again set the pointer to the beginning
fo.seek(0, 0)
line = fo.readline()
print("Read Line:", line)

# Close opened file
fo.close()

当我们运行上面的程序时,它会产生以下结果:

Name of the file:  foo.txt
Read Line: This is 1st line

Read Line: This is 1st line

示例

也可以相对于其在文件中的当前位置设置指针的新位置。为此,我们必须始终以二进制模式打开文件:它可以是读取二进制或写入二进制模式。然后,我们将要从当前位置移动的位置数作为偏移量参数传递,并将值 1 作为 whence 参数传递给该方法。

# Open a file
fo = open("foo.txt", "rb")
print("Name of the file: ", fo.name)

# Set the pointer to the new position relative to current position
fo.seek(18, 1)

line = fo.read()
print("File Contents:", line)

# Close opened file
fo.close()

执行给定程序后产生的输出将采用二进制形式。但可以使用 decode() 方法将其解码为字符串。

Name of the file:  foo.txt
File Contents: b'This is 2nd line\r\nThis is 3rd line\r\nThis is 4th line\r\nThis is 5th line'

示例

但是,在某些情况下,我们需要将指针设置在文件的末尾;例如,使用读写 (r+) 模式将信息追加到现有文件中。让我们看下面的一个示例,它在名为“foo.txt”的文件上演示了这一点。

# Open a file
fo = open("foo.txt", "r+")
print("Name of the file: ", fo.name)

# Set the pointer to the ending
fo.seek(0, 2)

fo.write("This is the end of file")

# Again set the pointer at the beginning
fo.seek(0, 0)

line = fo.read()
print("File Contents:", line)

# Close opened file
fo.close()

一旦我们编译并运行上面的程序,输出将如下所示:

Name of the file:  foo.txt
File Contents: This is 1st line
This is 2nd line
This is 3rd line
This is 4th line
This is 5th lineThis is the end of file

示例

正如我们上面已经讨论过的,文件的游标也可以从文件的末尾向后移动;或者从某个位置。在给定的示例中,我们以读取二进制 (rb) 模式打开文件“foo.txt”。文件游标通过将 whence 参数设置为 2 来设置在文件末尾,并且通过将负值作为偏移量参数传递给该方法,我们试图将文件游标向后移动。

# Open a file
fo = open("foo.txt", "rb")
print("Name of the file: ", fo.name)

# Move the pointer backwards using negative offset
fo.seek(-36, 2)

line = fo.read()
print("File Contents:", line)

# Close opened file
fo.close()

如果我们编译并运行上面的程序,文件内容将从文件末尾开始读取,直到指定的位置。

Name of the file:  foo.txt
File Contents: b'\r\nThis is 4th line\r\nThis is 5th line'

示例

tell() 方法与 seek() 方法配合使用。在下面的例子中,我们尝试使用 seek() 方法将文件光标设置到特定位置,然后使用 tell() 方法检索这个设置的位置。

# Open a file
fo = open("foo.txt", "r")
print("Name of the file: ", fo.name)

# Move the pointer backwards using negative offset
fo.seek(18, 0)

line = fo.read()
print("File Contents:", line)

#Using tell() method retrieve the cursor position from the ending
print("File cursor is present at position", fo.tell())

# Close opened file
fo.close()

运行上面的程序后,输出显示为:

Name of the file:  foo.txt
File Contents: This is 2nd line
This is 3rd line
This is 4th line
This is 5th line
File cursor is present at position 88
python_files_io.htm
广告