Найти в Дзене
programmer's notes (python and more)

Стандартные библиотеки в Python. Файлы прямого доступа. Приложение 1 к Видео 5

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Приложение к

Файлы прямого доступа в Python

Пож файлом прямого доступа обычно понимают файл, в котором можно получить доступ к любой записи по её номеру. При этом под словом 'файл' мы, конечно, понимаем программный объект, с которым мы работаем. В нашем случае под записью будет пониматься байт, мы рассматриваем байтовые (бинарные) файлы. Т.е. файл прямого доступа в нашем понимании это файл, в котором можно получить доступ к любому байту по его номеру. Нумерация при этом идёт с нуля. Ещё раз напомню, что любой файл в файловой системе можно открыть как бинарный файл.

Что для нас важно? Есть замечательный метод объекта файл seek(). Он переносит указатель файла к указанному байту. Первый параметр ― номер байта (смещение), второй параметр ― откуда вести счет:

  • 0 ― от начала файла;
  • 1 ― от текущего положения указателя;
  • 2 ― от конца файла.

Под концом файла понимается положение за последним байтом.

Метод seek() также возвращает текущее положение указателя в файле. Отсюда возникает естественный способ определения длины файла. Ниже представлена программа, которая показывает способ определения длины файла.

#!/usr/bin/python3
# длина файла
f1 = open('2.txt', 'r+')
l = f1.seek(0, 2)
l1 = f1.tell()
print(l, l1)
f1.close()

После того, как указатель перенесён в конец файла, определить положение указателя и тем самым длину файла можно двумя способами: по значению, возвращаемому методом seek() и использованием метода tell().

В следующем примере показано, как сделать запись в конец файла.

#!/usr/bin/python3
# записать в конец
f1 = open('2.txt', 'rb+')
l = f1.seek(0, 2)
s = 'Конец файла'.encode('utf-8')
f1.write(s)
f1.close()

s, как вы должно быть уже поняли, это строка байтов. Строка utf-8 преобразуется в строку байтов с помощью метода encode().

Мы несколько видоизменили программу, которую рассматривали на видеоуроке. Теперь строка байтов вставляется в произвольное место файла. В переменно m содержится номер байта, куда производится вставка. При m = 0 мы как раз получаем случай, который был рассмотрен на видеоуроке.

Текст программы см. ниже
Текст программы см. ниже
primer45.py

Смысл алгоритма заключается в следующем. Чтобы вставить строку байтов, нужно раздвинуть файла. Отодвинуть часть файла начиная с указанного места (m) в сторону конца файла. Предварительно мы удлиняем файл как раз на нужное количество байтов, приписывая в конец строку s1. А далее побайтово читаем начиная с l и в сторону меньших байтов и записываем в старшие адреса, начиная с самого старшего и далее уменьшая номер. Действие выполняется пока l не становится меньше m. В результате образуется "брешь", куда мы и записываем строку байтов s.

В следующем приложении мы усложним и усовершенствуем указанный алгоритм.

Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Ты записался в программисты?
Ты записался в программисты?