|
1 / 1 / 0
Регистрация: 30.04.2019
Сообщений: 89
|
|
Хранение структур данных22.07.2019, 21:03. Показов 3864. Ответов 11
Метки нет (Все метки)
Здравствуйте!
Задача: имеется xml-файл, необходимо распарсить его и представить элементы в виде массива экземпляров определенного класса; сохранить на диске (что-то вроде базы данных). Я распарсил xml, получил элементы и тэги. Написал класс и функцию, которая проходит по элементам и строит из них экземпляры класса. На выходе я имею массив с экземплярами класса. Вопрос: как хранить сам класс и массив с его экземлярами так, чтобы пользователь просто прописывает import и свободно обращается к экземплярам класса, к их методам? Я пользовался pickle, однако выглядит не очень эффективно. Представляется, что есть какой-то стандартный pipeline для подобных процедур.
0
|
|
| 22.07.2019, 21:03 | |
|
Ответы с готовыми решениями:
11
Хранение сложных структур данных в БД
Хранение различных структур и методов |
|
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,762
|
|
| 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 Хранение информации в виде массива структур Написать программу, реализующую хранение информации в массиве структур Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|