Как получить текущую позицию указателя в файле при чтении или записи?

Используйте метод file.tell().

Пример:

    
    with open("file.txt", "r") as file:
        print(file.tell()) # Выведет 0 (начало файла)
        file.read(10)
        print(file.tell()) # Выведет 10 (после чтения 10 байт)
    
  

Для получения текущей позиции указателя в файле при чтении или записи в Python, используется метод tell(). Этот метод возвращает целое число, представляющее текущую позицию указателя в файле в байтах относительно начала файла.

Пример при чтении:


  with open("my_file.txt", "r") as f:
    print("Начальная позиция:", f.tell())  # Вернет 0

    data = f.read(10)
    print("Прочитано:", data)
    print("Текущая позиция:", f.tell())  # Вернет 10

    f.seek(0) # Вернуться в начало файла
    print("Позиция после seek(0):", f.tell()) # Вернет 0
  

Пример при записи:


  with open("my_file.txt", "w") as f: # Открываем файл для записи, содержимое будет перезаписано
    print("Начальная позиция:", f.tell())  # Вернет 0

    f.write("Hello, world!")
    print("Текущая позиция:", f.tell())  # Вернет 13 (количество байт в "Hello, world!")

    f.seek(5) # Перейти к 6-ому байту
    f.write("Python")
    print("Текущая позиция:", f.tell()) # Вернет 11 - позиция после вставки "Python", учитывая длину "Hello" (5 символов) + длина "Python"(6 символов).
  

Важно:

  • Позиция указателя отсчитывается в байтах.
  • Метод tell() можно использовать как с текстовыми, так и с бинарными файлами.
  • После открытия файла позиция указателя обычно находится в начале файла (0).
  • Операции чтения и записи увеличивают позицию указателя.
  • Метод seek() позволяет изменить позицию указателя в файле на произвольное значение. Применяется для случайного доступа к файлу. Параметры seek(offset, whence): offset - смещение, whence - точка отсчета (0 - начало, 1 - текущая позиция, 2 - конец файла). Если whence не указан, то по умолчанию он равен 0.
  • В текстовых файлах использование seek() с whence, отличным от 0, может привести к непредсказуемым результатам, особенно если файл содержит многобайтовые символы (например, UTF-8), поскольку может нарушить целостность символов. В таких случаях рекомендуется оперировать позициями, полученными от tell().

Когда это может быть полезно?

  • При обработке больших файлов, чтобы отслеживать прогресс чтения/записи.
  • При реализации функций "отмены" действий в текстовом редакторе (запоминая позиции изменений).
  • При работе с файлами произвольного доступа, когда требуется читать/писать данные в определенные места в файле.
  • Для возобновления прерванной записи/чтения файла.
0