|
1 / 1 / 0
Регистрация: 30.04.2019
Сообщений: 89
|
|
Хранение структур данных22.07.2019, 21:03. Показов 3949. Ответов 11
Метки нет (Все метки)
Здравствуйте!
Задача: имеется xml-файл, необходимо распарсить его и представить элементы в виде массива экземпляров определенного класса; сохранить на диске (что-то вроде базы данных). Я распарсил xml, получил элементы и тэги. Написал класс и функцию, которая проходит по элементам и строит из них экземпляры класса. На выходе я имею массив с экземплярами класса. Вопрос: как хранить сам класс и массив с его экземлярами так, чтобы пользователь просто прописывает import и свободно обращается к экземплярам класса, к их методам? Я пользовался pickle, однако выглядит не очень эффективно. Представляется, что есть какой-то стандартный pipeline для подобных процедур.
0
|
|
| 22.07.2019, 21:03 | |
|
Ответы с готовыми решениями:
11
Хранение сложных структур данных в БД
Хранение различных структур и методов |
|
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
|
|
| 22.07.2019, 22:35 | |
|
0
|
|
| 23.07.2019, 00:42 | ||
|
Вобщем так. Если Вы хотите сохранить экземпляры класса в базе данных так, что бы после извлечения они полноценно работали со всеми свойствами и методами, то их нужно поместить в словарь и с помощью модуля shelve сохранить элементы этого словаря в базе данных. Причем структура этой базы данных будет иметь структуру вашего словаря. и с ней можно работать так же, как с обычным словарем питона. То есть извлекать из нее элементы по одному и сохранять новые элементы словаря добавлением в базу данных. Причем экземпляры класса после извлечения из базы данных, будут полноценно работать со всеми методами. Одно условие, описание класса не должно менять своего расположения. Если Вы модуль с классом перенесете в другой каталог, и даже пропишете импорт из нового местоположения, то экземпляры классов при извлечении их из БД не будут находить свой класс и потому не будут работать. Поэтому я обычно размещаю модуль с классом и базу данных в одном каталоге. Подробно работу с модулем shelve Вы можете прочитать в Лутц М. Программирование на Python. Том 1 (4-е издание, 2011) в главе 1, в разделе Модуль shelve. Добавлено через 7 минут Вы можете каждому экземпляру класса присвоить свой ключ и сохранить в БД. Тогда сможете по ключу извлекать нужный экземпляр класса из БД. Но можно и всему массиву присвоить ключ и поместить в БД. Но тогда извлечь из БД Вы сможете только весь массив сразу и только потом по индексу извлекать из него экземпляры классов.
1
|
||
|
|
||
| 23.07.2019, 13:42 | ||
|
А посему - если нужно как можно меньше кода и ожидается, что кроме питона ваши объекты никто читать не будет - то pickle. Добавлено через 51 секунду constantin_01, да, кстати, результат pickle - это строка. И вы ней можете делать всё, что можно сделать с обычной строкой - например, записать в настоящую БД.
0
|
||
|
1 / 1 / 0
Регистрация: 30.04.2019
Сообщений: 89
|
|
| 23.07.2019, 16:09 [ТС] | |
|
dondublon, спасибо за ответ!
Будет ли правильным, если я будут хранить саму коллекцию экземпляров классов с помощью pickle, а код класса импортировать? То есть перед работой нужно будет загрузить через pickle коллекцию и импортировать код класса чтобы осуществлять манипуляцию над экземплярами класса? Предполагается, что в будущем проект разрастется и будет сформирована библиотека.
0
|
|
|
|
|
| 23.07.2019, 16:19 | |
|
constantin_01, именно. Сначала импортить классы, потом pickle.load экземпляров.
Добавлено через 43 секунды constantin_01, при этом имейте в виду, что если класс поменяется, возможны проблемы с загрузкой. Но тут уж - - -
0
|
|
|
1 / 1 / 0
Регистрация: 30.04.2019
Сообщений: 89
|
|
| 23.07.2019, 20:44 [ТС] | |
|
dondublon, все таки проблема с хранения структуры не решена:
если использовать pickle, то не хватает памяти для хранения массива структур, а разбивать файл на 10-15 - сомнительно. если использовать shelve, то конечный файл будет весить больше, чем xml-файл. если использовать json, то нечего не получиться, так как json поддерживает только дефолтные типы данных я в отчаяние, не мог даже подумать, что такая рутинная работа может быть сложной задачей. Добавлено через 1 минуту если я уточню свою главную задачу, может быть станет яснее: я хочу конвертировать xml словарь с помеченными словами русского языка, каждое слово я представляю как суффиксное дерево (trie).
0
|
|
| 23.07.2019, 20:53 | ||
|
Удачи Вам.
0
|
||
|
|
||||||||||||
| 23.07.2019, 22:32 | ||||||||||||
|
... Вот только что сконвертировал xml от opencorpora в DAWG словарь. Кликните здесь для просмотра всего текста
D:\INSTALL\Python3\Lib\site-packages>git clone https://github.com/kmike/pymorphy2-dicts
Cloning into 'pymorphy2-dicts'... remote: Enumerating objects: 133, done. remote: Total 133 (delta 0), reused 0 (delta 0), pack-reused 133R Receiving objects: 100% (133/133), 22.28 KiB | 183.00 KiB/s, done. Resolving deltas: 100% (64/64), done. D:\INSTALL\Python3\Lib\site-packages>cd pymorphy2-dicts D:\INSTALL\Python3\Lib\site-packages\pymorphy2-dicts>wget http://opencorpora.org/files/e... ra.xml.bz2 --2019-07-23 21:52:48-- http://opencorpora.org/files/e... ra.xml.bz2 Resolving opencorpora.org... 148.251.2.141 Connecting to opencorpora.org|148.251.2.141|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 16840680 (16M) [application/x-bzip2] Saving to: `dict.opcorpora.xml.bz2' 100%[======================================== ======================================== ======================================== ====== 2019-07-23 21:53:10 (757 KB/s) - `dict.opcorpora.xml.bz2' saved [16840680/16840680] D:\INSTALL\Python3\Lib\site-packages\pymorphy2-dicts>bzip2 -dk dict.opcorpora.xml.bz2 D:\INSTALL\Python3\Lib\site-packages\pymorphy2-dicts>pip3.5 install opencorpora-tools Collecting opencorpora-tools Using cached https://files.pythonhosted.org... ne-any.whl Requirement already satisfied: lxml in d:\install\python3\lib\site-packages (from opencorpora-tools) (4.1.1) Installing collected packages: opencorpora-tools Successfully installed opencorpora-tools-0.5 D:\INSTALL\Python3\Lib\site-packages\pymorphy2-dicts>py -3.5 build-dict.py dict.opcorpora.xml data DEBUG 2019-07-23 21:56:47 Creating output folder data INFO 2019-07-23 21:56:47 dictionary v0.92, rev411334 INFO 2019-07-23 21:56:47 parsing XML dictionary XML parsing: 648794it [02:58, 3633.54it/s] INFO 2019-07-23 21:59:47 simplifying tags: looking for tag spellings Looking for tag spellings: 100%|################################### ######################################## #### INFO 2019-07-23 21:59:54 simplifying tags: looking for spelling duplicates (skip_space_ambiguity: True) DEBUG 2019-07-23 21:59:54 310 duplicate tags will be removed INFO 2019-07-23 21:59:54 simplifying tags: fixing Simplifying tags: 100%|################################### ######################################## ############# INFO 2019-07-23 22:00:01 dropping unsupported parses INFO 2019-07-23 22:00:04 inlining lexeme derivational rules INFO 2019-07-23 22:00:06 lexemes after link inlining: 183895 INFO 2019-07-23 22:00:06 building paradigms DEBUG 2019-07-23 22:00:06 word len(gramtab) len(words) len(paradigms) DEBUG 2019-07-23 22:00:06 ёж 12 12 1 DEBUG 2019-07-23 22:00:12 апитоксин 1308 185887 279 DEBUG 2019-07-23 22:00:14 болеутоляющее 1917 384755 517 DEBUG 2019-07-23 22:00:17 восстановление 2529 632733 934 DEBUG 2019-07-23 22:00:20 гретта 2956 931085 1254 DEBUG 2019-07-23 22:00:24 жальце 3174 1189466 1441 DEBUG 2019-07-23 22:00:27 интерактивно 3419 1540411 1706 DEBUG 2019-07-23 22:00:30 крамер 3634 1781367 1858 DEBUG 2019-07-23 22:00:32 мезоатом 3751 1996790 1991 DEBUG 2019-07-23 22:00:35 невязка 3874 2300158 2120 DEBUG 2019-07-23 22:00:40 оборудование 3971 2583784 2233 DEBUG 2019-07-23 22:00:43 пентаполь 4202 2946714 2371 DEBUG 2019-07-23 22:00:47 поломойный 4222 3341599 2549 DEBUG 2019-07-23 22:00:52 профбилет 4438 3741575 2686 DEBUG 2019-07-23 22:00:56 рэл 4542 4055803 2786 DEBUG 2019-07-23 22:00:58 сохраняемость 4672 4320834 2897 DEBUG 2019-07-23 22:01:01 трепетный 4709 4571679 3002 DEBUG 2019-07-23 22:01:05 хлебопашеский 4843 4845275 3087 DEBUG 2019-07-23 22:01:08 ябука 4951 5064114 3207 DEBUG 2019-07-23 22:01:08 total: 5291 5109293 3330 DEBUG 2019-07-23 22:01:08 linearizing paradigms DEBUG 2019-07-23 22:01:08 calculating prediction data.. DEBUG 2019-07-23 22:01:08 calculating prediction data: removing non-productive paradigms.. DEBUG 2019-07-23 22:01:08 calculating prediction data: checking word endings.. Checking word endings: 100%|################################### ######################################## ######## DEBUG 2019-07-23 22:03:13 calculating prediction data: preparing DAFSA #0.. DEBUG 2019-07-23 22:03:16 calculating prediction data: preparing DAFSA #1.. DEBUG 2019-07-23 22:03:16 calculating prediction data: preparing DAFSA #2.. DEBUG 2019-07-23 22:03:17 building word DAFSA DEBUG 2019-07-23 22:03:42 building prediction_suffixes DAFSA #0 DEBUG 2019-07-23 22:04:05 building prediction_suffixes DAFSA #1 DEBUG 2019-07-23 22:04:05 building prediction_suffixes DAFSA #2 INFO 2019-07-23 22:04:05 Saving... DEBUG 2019-07-23 22:04:06 computing metadata.. DEBUG 2019-07-23 22:04:06 words_dawg_len DEBUG 2019-07-23 22:04:10 prediction_suffixes_dawgs_len Теперь могу им пользоваться в pymorphy2 вместо дефолтного.
0
|
||||||||||||
|
1 / 1 / 0
Регистрация: 30.04.2019
Сообщений: 89
|
|
| 24.07.2019, 10:07 [ТС] | |
|
Garry Galler, спасибо за ответ! Я задал вопрос еще раз, потому что хотел найти другой способ решения задачи, а так же потому, что сейчас чистый DAWG скачать на win10 не удается (https://github.com/pytries/DAWG/issues/34).
0
|
|
|
|
|||
| 24.07.2019, 10:58 | |||
|
Имейте в виду, что pickle на самом деле считывает классы-объекты целиком. Возможно, вам это и не нужно, вам нужно хранить только данные. У вас что, серьёзная развитая иерархия? Сомневаюсь. Если всё-таки иерархия - подойдёт и json (c адаптацией, если что-то нестандартное), и есть ещё малоизвестный формат hdf.
0
|
|||
|
|
|
| 24.07.2019, 12:40 | |
|
0
|
|
| 24.07.2019, 12:40 | |
|
Помогаю со студенческими работами здесь
12
Хранение информации, в массиве структур Arm и хранение структур в памяти Хранение структур в std::vector Хранение информации в виде массива структур Написать программу, реализующую хранение информации в массиве структур Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|