Как я могу имитировать файл с произвольным доступом в Python - PullRequest
0 голосов
/ 07 декабря 2018

Таким образом, курс, который я преподаю, требует обучения концепции случайных файлов - содержание курса указывает, что файлы имеют фиксированный размер / длину, каждое местоположение содержит запись, и место, в котором следует хранить /из которого определяется чтение, определяется через функцию хеширования (с коллизиями разбираются несколькими способами).Хотя я доволен теорией и псевдокодом, который используется для объяснения этой концепции, я должен признать, что я борюсь с превращением этого в подходящий код Python.

Что мне нужно, чтобы иметь возможность

  • использовать значение ключа и функцию хеширования для определения номера строки в файле (я могу сделать эту часть)
  • перейти к этой строке / местоположению в указанном файле
  • изменить или прочитать данные в этой строке / в этом местоположении

Я видел пару упоминаний о травлении и mmapПри проведении небольшого исследования, но не уверен, что это будет лучшим подходом.Очень благодарен за любое руководство.

1 Ответ

0 голосов
/ 08 декабря 2018

Проблема может быть разделена на две половины:

  1. Выбор (двоичного?) Формата фиксированной длины для ваших записей и возможность сериализации / десериализации ваших данных из него;результат должен быть фиксированной длиной строки.
  2. Поиск и чтение / запись таких записей в файле.

Для пункта 1 существует много возможностей.Вы можете использовать модуль struct для генерации / чтения двоичных данных, которые обычно имеют длину.

Более низкая технология, но все еще действующая, возможность просто работать с текстовыми записями фиксированного размера, каждое поле заполнено соответствующим образом.с пробелами или чем-то еще.Они могут быть легко сгенерированы с помощью bytes.format и разделены при чтении с использованием простой нарезки.

Только будьте осторожны, чтобы для правильной работы ваши поля должны быть соответствующим образом отформатированы / дополнены как byte строк, а не как Unicode (если вы собираете запись как строку Unicodeи затем преобразует его в UTF-8, он может изменить длину, поскольку UTF-8 является кодировкой переменной длины).

Что касается второй части, она самая простая: просто откройте файл в двоичном режиме (вы не хотите, чтобы перевод новой строки связывался с вашими байтами), используйте метод seekчтобы перейти к нужной записи (используя в качестве позиции номер записи, умноженной на ее размер) для чтения / записи, а затем используйте read (передавая размер записи) или write (передавая запись соответствующего размера).

...