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

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

22.07.2019, 21:03. Показов 3949. Ответов 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,764
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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
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
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru