Перейти к содержанию

Перемещение по файлу

Помимо состояния у файла есть адрес текущего положения, его часто называют курсор или смещение. Поскольку файл — это поток, то, когда мы считываем информацию из него, то постепенно смещаемся от начала к концу. Как если бы мы читали книгу и следили пальцем за текущим положением. В Python используется позиция в байтах или в количестве прочитанных символов.

Если вы хотите переместить указатель текущего положения в файле, то вызовите метод .seek(offset, from_what):

  • offset — это смещение, для того чтобы перейти на начало файла используйте 0
  • from_what — откуда считать. 0 — от начала, 1 — от текущей позиции, 2 — от конца файла, в этом случае смещение обычно негативное

Для того чтобы прочитать данные из файла есть несколько методов, для бинарных данных удобно использовать метод .read(size), где size — это сколько байт надо прочитать. После вызова функция возвращает данные, которые прочитает из файла, а текущее положение изменится.

Чтобы узнать свое текущее положение используйте метод .tell(). Он не изменяет положение курсора в файле.

Перемещение по файловому объекту

Как я говорил ранее не обязательно файловый объект привязан к файлу. Например, sys.stdout ведет себя как файл, в который можно только писать данные, но нельзя считывать. Перемещать указатель в таком файле невозможно. Но даже если вы открыли файл на диске будет разница в том в каком режиме вы его открыли. В текстовых документах текст зависит от кодировки, и вам может показаться что вы записали 1 символ, а он займет 2 или больше байт на диске. Особенно это касается эмодзи.

Давайте рассмотрим пример, я буду использовать бинарный файл для более простой иллюстрации:

>>> f = open('test.dat', 'wb+')
>>> f.write(b'0123456789')
10
>>> f.seek(5)
5
>>> f.read(1)
b'5'
>>> f.tell()
6
>>> f.seek(-3, 2)
7
>>> f.tell()
7
>>> f.read(1)
b'7'
>>> f.close()

Мы открыли файл test.dat в режиме для записи в бинарном режиме. С помощью метода .write() добавили в него последовательность байт. Перемещение внутри файла дало нам возможность считывать символы в определенных позициях, причем считывание перемещало курсор.

image