Python File seek() Method



The Python File seek() method sets the file's cursor at a specified position in the current file. A file's cursor is used to store the current position of the read and write operations in a file; and this method can move this file cursor forward or backward.

For instance, whenever we open a file to read from it, the file cursor is always positioned at 0. It is gradually incremented as we progress through the content of the file. But, some scenarios require the file to be read from a particular position in the file. This is where this method comes into picture.

Let us look at the various cases in which the seek() method is used −

  • If the file is opened for appending using either 'a' or 'a+', any seek() operations will be undone at the next write.
  • If the file is only opened for writing in append mode using 'a', this method is essentially a no-op, but it remains useful for files opened in append mode with reading enabled (mode 'a+').
  • If the file is opened in text mode using 't', only offsets returned by tell() are legal. Use of other offsets causes undefined behaviour.
  • All file objects are seekable.

Syntax

Following is the syntax for the Python File seek() method −

fileObject.seek(offset[, whence])

Parameters

  • offset − This is the number of positions of the read/write pointer to move within the file.

  • whence − (Optional) It defaults to 0; which means absolute file positioning, other values are 1 which means seek relative to the current position and 2 means seek relative to the file's end.

Return Value

This method does not return any value. It just sets the cursor at the specified offset.

Example

Consider a demo file "foo.txt" containing 5 lines.

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

The following example shows the usage of the Python File seek() method. We are trying to set the pointer at the beginning of the file. Hence, we pass the offset argument as 0 to this method.

# 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()

When we run above program, it produces following result −

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

Read Line: This is 1st line

Example

The new position of the pointer can also be set relative to its current position in the file. To do that, we must always open the file in the binary mode: it can either be in reading binary or writing binary modes. Then, we are passing the number of positions to move from the current position as the offset argument and the value 1 as the whence argument to the method.

# 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()

The output produced after executing the given program will be in the binary form. But it can be decoded into a string using the decode() method.

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'

Example

However, in some cases we need the pointer to be set at the ending of the file; such as appending information to an existing file using the read and write (r+) mode. Let us see an example below demonstrating the same on a file named "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()

Once we compile and run the program above, the output is produced as follows −

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

Example

As we have already discussed above, the file's cursor can also move backwards from the end of the file; or from a certain position. In the given example, we are opening a file "foo.txt" in the reading binary (rb) mode. The file cursor is set at the end of file by passing the whence argument as 2 and by passing negative values as the offset parameter to the method, we are trying to move the file cursor backwards.

# 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()

If we compile and run the program above, the file contents are read from the end of file up to the given number of positions.

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

Example

The tell() method goes hand-in-hand with the seek() method. In the following example, we are trying to use the seek() method to set the file cursor at a specific position and then, use the tell() method to retrieve this position set.

# 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()

On executing the program above, the output is displayed as −

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
Advertisements