С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
1 / 1 / 0
Регистрация: 30.04.2019
Сообщений: 89

Хранение структур данных

22.07.2019, 21:03. Показов 3864. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Задача: имеется xml-файл, необходимо распарсить его и представить элементы в виде массива экземпляров определенного класса; сохранить на диске (что-то вроде базы данных).

Я распарсил xml, получил элементы и тэги. Написал класс и функцию, которая проходит по элементам и строит из них экземпляры класса. На выходе я имею массив с экземплярами класса.

Вопрос: как хранить сам класс и массив с его экземлярами так, чтобы пользователь просто прописывает import и свободно обращается к экземплярам класса, к их методам?

Я пользовался pickle, однако выглядит не очень эффективно. Представляется, что есть какой-то стандартный pipeline для подобных процедур.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2019, 21:03
Ответы с готовыми решениями:

Хранение сложных структур данных в БД
Возникла такая проблема: У меня есть N категорий сайтов. У каждого сайта есть M частей. Каждая часть имеет K пар...

Организовать хранение набора данных с помощью массива структур
Организовать хранение набора данных с помощью массива структур. Написать метод для заполнения массива данными. Написать метод для...

Хранение различных структур и методов
Мне нужно хранить некоторые методы, структуры и прочие данные в отдельных классах что бы как то разбавлять код. Делать его более...

11
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,762
22.07.2019, 22:35
json?
https://pypi.org/project/xmljson/
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
23.07.2019, 00:42
Цитата Сообщение от constantin_01 Посмотреть сообщение
Вопрос: как хранить сам класс и массив с его экземлярами так, чтобы пользователь просто прописывает import и свободно обращается к экземплярам класса, к их методам?
Вопрос не совсем понятен. Что значит "чтобы пользователь просто прописывает import и свободно обращается к экземплярам класса, к их методам?" Что за пользователь, который будет прописывать import ?
Вобщем так. Если Вы хотите сохранить экземпляры класса в базе данных так, что бы после извлечения они полноценно работали со всеми свойствами и методами, то их нужно поместить в словарь и с помощью модуля shelve сохранить элементы этого словаря в базе данных. Причем структура этой базы данных будет иметь структуру вашего словаря. и с ней можно работать так же, как с обычным словарем питона. То есть извлекать из нее элементы по одному и сохранять новые элементы словаря добавлением в базу данных. Причем экземпляры класса после извлечения из базы данных, будут полноценно работать со всеми методами. Одно условие, описание класса не должно менять своего расположения. Если Вы модуль с классом перенесете в другой каталог, и даже пропишете импорт из нового местоположения, то экземпляры классов при извлечении их из БД не будут находить свой класс и потому не будут работать. Поэтому я обычно размещаю модуль с классом и базу данных в одном каталоге.
Подробно работу с модулем shelve Вы можете прочитать в Лутц М. Программирование на Python. Том 1 (4-е издание, 2011) в главе 1, в разделе Модуль shelve.

Добавлено через 7 минут
Вы можете каждому экземпляру класса присвоить свой ключ и сохранить в БД. Тогда сможете по ключу извлекать нужный экземпляр класса из БД. Но можно и всему массиву присвоить ключ и поместить в БД. Но тогда извлечь из БД Вы сможете только весь массив сразу и только потом по индексу извлекать из него экземпляры классов.
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 6
23.07.2019, 13:42
Цитата Сообщение от constantin_01 Посмотреть сообщение
пользователь просто прописывает import и свободно обращается к экземплярам класса, к их методам?
import служит для импорта типов, то бишь описаний классов, а не их созданных экземпляров (объектов). Технически, конечно, можно и объекты заимпортить, но не надо так делать.

А посему - если нужно как можно меньше кода и ожидается, что кроме питона ваши объекты никто читать не будет - то pickle.

Добавлено через 51 секунду
constantin_01, да, кстати, результат pickle - это строка. И вы ней можете делать всё, что можно сделать с обычной строкой - например, записать в настоящую БД.
0
1 / 1 / 0
Регистрация: 30.04.2019
Сообщений: 89
23.07.2019, 16:09  [ТС]
dondublon, спасибо за ответ!

Будет ли правильным, если я будут хранить саму коллекцию экземпляров классов с помощью pickle, а код класса импортировать? То есть перед работой нужно будет загрузить через pickle коллекцию и импортировать код класса чтобы
осуществлять манипуляцию над экземплярами класса? Предполагается, что в будущем проект разрастется и будет сформирована библиотека.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 6
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
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
23.07.2019, 20:53
Цитата Сообщение от constantin_01 Посмотреть сообщение
если использовать shelve, то конечный файл будет весить больше, чем xml-файл
Я думал, что Вас интересует размещение информации для удобства работы с ней. Если же Вам нужна оптимизация для уменьшения размеров хранилища информации, то я тут ничем помочь не могу. Меня не интересуют скорость и объемы информации, только удобство работы с ней.
Удачи Вам.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
23.07.2019, 22:32
Цитата Сообщение от constantin_01 Посмотреть сообщение
я хочу конвертировать xml словарь с помеченными словами русского языка, каждое слово я представляю как суффиксное дерево (trie)
Я же вам еще в прошлой теме написал как сделать суффиксное дерево такое же как у pymorhpy2.
... Вот только что сконвертировал 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 вместо дефолтного.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import sys,os
import pymorphy2
from pprint import pprint
 
path = os.path.join(
    os.path.dirname(sys.executable),
    r"lib\site-packages\pymorphy2_dicts_ru\data\new"
    )
 
morph = pymorphy2.MorphAnalyzer(path=path)
parse_word = morph.parse('корпус')
pprint(parse_word)
print(sum( 1 for i in morph.dictionary.words.iteritems()))

Code
1
2
3
[Parse(word='корпус', tag=OpencorporaTag('NOUN,inan,masc sing,nomn'), normal_form='корпус', score=1.0, methods_stack=((DictionaryAnalyzer(), 'корпус', 293, 0),)),
 Parse(word='корпус', tag=OpencorporaTag('NOUN,inan,masc sing,accs'), normal_form='корпус', score=1.0, methods_stack=((DictionaryAnalyzer(), 'корпус', 293, 3),))]
5109257
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
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 6
24.07.2019, 10:58
Цитата Сообщение от constantin_01 Посмотреть сообщение
если использовать pickle, то не хватает памяти для хранения массива структур, а разбивать файл на 10-15 - сомнительно.
Не понял. На считывание в память у вас памяти хватает, а на запись - нет? Не верю.

Цитата Сообщение от constantin_01 Посмотреть сообщение
я хочу конвертировать xml
Конвертировать во что? Если в объекты в памяти - вроде, вы это уже сдалали.

Имейте в виду, что pickle на самом деле считывает классы-объекты целиком. Возможно, вам это и не нужно, вам нужно хранить только данные.
У вас что, серьёзная развитая иерархия? Сомневаюсь.
Если всё-таки иерархия - подойдёт и json (c адаптацией, если что-то нестандартное), и есть ещё малоизвестный формат hdf.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
24.07.2019, 12:40
Цитата Сообщение от constantin_01 Посмотреть сообщение
сейчас чистый DAWG скачать на win10 не удается
https://www.lfd.uci.edu/~gohlke/pythonlibs/#dawg
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2019, 12:40
Помогаю со студенческими работами здесь

Хранение информации, в массиве структур
Написать программу, реализующую хранение информации, в массиве структур и следующие действия: • добавление элемента • удаление...

Arm и хранение структур в памяти
Помогите разобраться с битовыми полями, при работе с пакетами очень удобно struct strPackTx { /* First byte */ uint16_t...

Хранение структур в std::vector
доьрево времени суток, мне интересно возможно ли записать структуру в вектор. если да, то можно узать как туда записывать и чытать...

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

Написать программу, реализующую хранение информации в массиве структур
Тема : Подпрограммы. Задание : первый скрин-вариант, второй - что нужно реализовать. помогите пожалуйста, завтра зачет!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru