Целесообразно ли сохранять данные в виде модулей Python?
Это то, что я сделал для проекта. У меня есть несколько структур данных, которые являются основными словарями с некоторыми методами, которые работают с данными. Когда я сохраняю их на диск, я записываю их в файлы.py в виде кода, который при импорте в виде модуля загружает те же данные в такую структуру данных.
Это разумно? Есть ли большие недостатки? Я вижу преимущество в том, что когда я хочу работать с сохраненными данными, я могу быстро импортировать нужные мне модули. Кроме того, модули можно использовать отдельно от остальной части приложения, поскольку вам не нужны отдельные функции синтаксического анализатора или загрузчика.
5 ответов
Это разумно, и я делаю это все время. Очевидно, это не тот формат, который вы используете для обмена данными, так что это не очень хороший формат для чего-то вроде файла сохранения.
Но, например, когда я выполняю миграцию веб-сайтов на Plone, я часто получаю данные о сайте (например, список страниц, которые нужно перенести, или список того, как старые URL должны быть сопоставлены с новыми, или списки тегов.). Это вы обычно получаете в формате Word и Excel. Кроме того, данные часто нужно немного помассировать, и я в конечном итоге получаю словари, отображающие один URL-адрес для какой-то другой информации.
Конечно, я мог бы сохранить это как CVS и разобрать его в словарь. Но вместо этого я обычно сохраняю его как файл Python со словарем. Сохраняет код
Так что, да, это разумно, нет, это не тот формат, который вы должны использовать для любого файла сохранения. Однако он часто используется для данных, которые пересекают границу конфигурации, как описано выше.
Действуя таким образом, вы можете получить некоторое удобство, но вы платите за это много разных цен. Пространство, необходимое для сохранения ваших данных, и время, необходимое для их сохранения и перезагрузки, существенно увеличиваются; и ваша безопасность не ограничена - вы должны свирепо защищать пути, с которых вы перезагружаете модули, поскольку это позволит любому злоумышленнику легко внедрить код по своему выбору для выполнения под вашим идентификатором пользователя (pickle
сам по себе не очень прочный, с точки зрения безопасности, но по сравнению с этим механизмом он сияет;-).
В целом, я предпочитаю более простое и более традиционное расположение: исполняемый код находится в одном модуле (по типичному пути загрузки кода, который не должен быть R/W после компиляции модуля) - он загружается только один раз и из уже скомпилированной формы. Данные хранятся в своих собственных файлах (или частях БД и т. Д.) В любом из множества подходящих форматов, в основном стандартных (возможно, включая многоязычные, такие как JSON, CSV, XML, ... и т. Д., Если я хочу сохранить возможность открыть, чтобы легко загрузить эти данные с других языков в будущем).
Ответ Алекса Мартелли абсолютно проницательный, и я согласен с ним. Однако я сделаю еще один шаг и дам конкретную рекомендацию: используйте JSON.
JSON прост, и структуры данных Python хорошо вписываются в него; и есть несколько стандартных библиотек и инструментов для работы с JSON. json
модуль в Python 3.0 и новее основан на simplejson, поэтому я бы использовал simplejson
в Python 2.x и json
в Python 3.0 и новее.
Второй выбор - XML. XML более сложный, и его сложнее просто посмотреть (или просто отредактировать с помощью текстового редактора), но существует множество инструментов для его проверки, фильтрации, редактирования и т. Д.
Кроме того, если ваши потребности в хранении и извлечении данных становятся нетривиальными, рассмотрите возможность использования реальной базы данных. SQLite потрясающий: он маленький, и для небольших баз данных работает очень быстро, но это реальная база данных SQL. Я определенно использовал бы Python ORM вместо изучения SQL для взаимодействия с базой данных; мой любимый ORM для SQLite - это Autumn (маленький и простой) или ORM от Django (вам даже не нужно учиться создавать таблицы в SQL!). Если вы когда-нибудь перерастете SQLite, вы сможете перейти к реальному база данных, такая как PostgreSQL. Если вы обнаружите, что пишете много циклов, которые выполняют поиск в ваших сохраненных данных, и особенно если вам нужно навязать зависимости (например, если foo удален, bar тоже должен быть удален), подумайте о переходе в базу данных.
Самый большой недостаток в том, что это потенциальная проблема безопасности, поскольку трудно гарантировать, что файлы не будут содержать произвольный код, что может быть очень плохо. Так что не используйте этот подход, если кто-то, кроме вас, имеет доступ на запись к файлам.
Разумным вариантом может быть использование модуля Pickle, который специально разработан для сохранения и восстановления структур python на диск.