Вопрос

Это то, что я сделал для одного проекта.У меня есть несколько структур данных, которые в основном являются словарями с некоторыми методами, которые работают с данными.Когда я сохраняю их на диск, я записываю их в файлы .py в виде кода, который при импорте в виде модуля загрузит те же данные в такую структуру данных.

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

Это было полезно?

Решение

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

Но, например, когда я выполняю миграцию веб-сайтов на Plone, я часто получаю данные о сайте (например, список того, какие страницы следует перенести, или список того, как старые URL-адреса должны быть сопоставлены с новыми, или списки тегов).Их вы обычно получаете в формате Word или Excel.Кроме того, данные часто нуждаются в небольшом массировании, и в итоге я получаю то, что по сути представляет собой словари, сопоставляющие один URL с некоторой другой информацией.

Конечно, я мог бы сохраните это как CVS и проанализируйте в словаре.Но вместо этого я обычно сохраняю его как файл Python со словарем.Сохраняет код.

Так что, да, это разумно, нет, это не тот формат, который вы должны использовать для сохранения любого файла.Однако он часто используется для данных, которые пересекают границу с конфигурацией, как описано выше.

Другие советы

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

В целом, я предпочитаю более простую и традиционную аранжировку:исполняемый код находится в одном модуле (по обычному пути загрузки кода, который не обязательно должен быть R / W после компиляции модуля) - он загружается только один раз и из уже скомпилированной формы.Данные хранятся в своих собственных файлах (или частях базы данных и т.д.) В любом из множества подходящих форматов, в основном стандартных (возможно, включая многоязычные, такие как JSON, CSV, XML, ...& c, если я хочу оставить опцию открытой, чтобы в будущем легко загружать эти данные с других языков).

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

Разумным вариантом могло бы быть использование Маринованный Огурец модуль, который специально разработан для сохранения и восстановления структур python на диск.

Ответ Алекса Мартелли абсолютно проницателен, и я согласен с ним.Однако я сделаю еще один шаг вперед и дам конкретную рекомендацию:используйте JSON.

JSON прост, и структуры данных Python хорошо вписываются в него;и есть несколько стандартных библиотек и инструментов для работы с JSON.Тот Самый json модуль в Python 3.0 и новее основан на простой джон, поэтому я бы использовал simplejson в Python 2.x и json на Python 3.0 и новее.

Второй вариант - XML.XML сложнее, и на него сложнее просто смотреть (или просто редактировать с помощью текстового редактора), но существует огромное количество инструментов для его проверки, фильтрации, редактирования и т.д.

Кроме того, если ваши потребности в хранении и извлечении данных становятся совсем нетривиальными, подумайте об использовании реальной базы данных. SQLite - файл это потрясающе:она небольшая и для небольших баз данных работает очень быстро, но это настоящая база данных SQL.Я бы определенно использовал Python ORM вместо изучения SQL для взаимодействия с базой данных;моим любимым ORM для SQLite был бы Осень (маленький и простой), или ORM из Джанго (вам даже не нужно учиться создавать таблицы в SQL!) Тогда, если вы когда-нибудь перерастете SQLite, вы сможете перейти к реальной базе данных, такой как PostgreSQL.Если вы обнаружите, что пишете множество циклов, которые выполняют поиск по вашим сохраненным данным, и особенно если вам нужно обеспечить соблюдение зависимостей (например, если foo удален, bar тоже должен быть удален), подумайте о переходе к базе данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top