Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2017 20:57:59

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Создание спиков на лету.

FishHook
Повторю свою мысль - совершенно плевать, в каком формате передавать данные.
Ну у нас наверное разные области приложения xml. Когда оно работает в рамках SOAP конечно нет проблем.
Но тотже топикстартер насколько я понял хочет использовать этот формат для хранения данных, вместо того чтобы взять нормальную СУБД.

Пара примеров из жизни.
Товарищи о которых я говорил используют xml для задания начальных условий и параметров для решения задачи коши. Используется xml парсер дает аналог etree Объектов у них много входной файл под 10 мегабайт который они ручками редактируют. И код у них страшненький длиннющая колбаса преобразования в str во float int vector<float> тоже на сотни килобайт. И не поможет тут похоже ОРМ.

Другой пример - xml. Для описания схем электрических соединений Важно какой формат, поскольку xml читается час! А с нормальным постгресом нет проблем.



Офлайн

#2 Сен. 16, 2017 21:25:50

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Создание спиков на лету.

doza_and
Товарищи о которых я говорил используют xml для задания начальных условий и параметров для решения задачи коши. Используется xml парсер дает аналог etree Объектов у них много входной файл под 10 мегабайт который они ручками редактируют. И код у них страшненький длиннющая колбаса преобразования в str во float int vector<float> тоже на сотни килобайт. И не поможет тут похоже ОРМ.

Слушайте, но это же идиотизм. Вы думаете, что заменив XML на YAML градус идиотизма уменьшится? Разумеется нет.
Вы против XML как формата для хранения состояния объектов и передачи его между центрами обработки данных? Вижу что не против. И это его предназначение. И он в этом плане здорово работает. То, что находятся товарищи, которые работают с ним вручную - это сугубо их трудности. Когда вы говорите
Трудно придумать что-то хуже чем засунуть в XML формат.
я вас, увы, не понимаю, это похоже на расизм - эмоции есть, а подоплёки нет, кроме апеллирования к каким-то мифическим тибетским монахам, которые вручную пишут тома xmlей



Офлайн

#3 Сен. 16, 2017 23:19:36

Stazot
Зарегистрирован: 2017-08-07
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание спиков на лету.

py.user.next
Пример

<Categories>
<Electric>
<Lumps>Subcategory1
<h2></h2>
<h4></h4>
<halogen></halogen>

</Lumps>
<wires>Subcategory2
<cuprum_wires></cuprum_wires>
<aluminium_wires></aluminium_wires>
</wires>

</Electric>
<wheels value2="Value2">
<disks>SubElement3
<16></16>
<18></18>
<19></19>
<22></22>
</disks>
<tires>SubElement4
<16></16>
<18></18>
<19></19>
<22></22>
</tires>
</wheels>
</Categories>
мне нужно получить дерево. Пытаюсь сделать списками
 categories= {'Electric':{'Lumps':{'h2':"", 'h4':"","halogen":""},'wires':{'cuprum_wires':"", 'aluminium_wires':""}}, "wheels":{'disks':{"16":"", "18":"",...,"22":""}, 'tires':{"16":"", "18":"",...,"22":""}}}
а потом циклом бегать и смотреть и разбивать строку на разделы парся регулярными выражениями. и смотреть есть ли в строке вхождение сначала по категории, потом по под категории. и относить строку к этим категориям если вхождения есть. строк порядка 300 тыс.
Если подскажете как по другому решить эту проблему, буду рад. Пока только так. В самой строке есть поле категория, но оно не подходит так как там их, этих категорий, порядка 30тыс.

Офлайн

#4 Сен. 16, 2017 23:52:31

Stazot
Зарегистрирован: 2017-08-07
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание спиков на лету.

FishHook
Как бы ты реализовал. в ручную создаются категории и подкатегории. Затем нужно просмотреть строку и отнести её в определенную подкатегорию которая входит в категорию.
структура такова

категория1
подкатегория1
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
подкатегория2
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
критерий отношения к категории4
категория2
подкатегория1
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
подкатегория2
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
критерий отношения к категории4
затем вывести список по полям
Я програмированием увлекаюсь.(не профессия) у знакомого такая задача есть в 1с, я решил на python попробовать. В .Net проще с XML работать ((

Офлайн

#5 Сен. 17, 2017 01:53:52

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Создание спиков на лету.

Stazot
ну можно сделать рекурсивный парсинг XML, но лучше посмотри в сторону SQLITE хотя бы - такая структура делается через связанные таблицы - https://www.webursitet.ru/Files/sql-dlya-neprogrammistov-demo.pdf

 from lxml import etree
xml='''
<Categories>
    <Electric name="Name" id='123'>
        <Lumps>
            <h2>123</h2>
            <h4>234</h4>
            <halogen></halogen>
        </Lumps>
        <wires>
            <cuprum_wires></cuprum_wires>
            <aluminium_wires></aluminium_wires>
        </wires>
    </Electric>
    <wheels>
        <disks>
        <r13>r13</r13>
        </disks>
        <tires>
        <t13>t13</t13>
        </tires>
    </wheels>
</Categories>
'''
def get_node(node,lst):
    txt = ''
    if node.text: txt = node.text.strip()
    lst.append([node.tag,node.keys(),node.values(),txt])
    for n in node:
        get_node(n,lst)
    
tree = etree.fromstring(xml)
out = []
get_node(tree,out)
for i in out: print i

Отредактировано vic57 (Сен. 17, 2017 02:01:22)

Офлайн

#6 Сен. 17, 2017 02:56:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10019
Репутация: +  857  -
Профиль   Отправить e-mail  

Создание спиков на лету.

Stazot
и смотреть есть ли в строке вхождение сначала по категории, потом по под категории. и относить строку к этим категориям если вхождения есть.
По-моему, ты пытаешься изобрести xpath.
Вот ты перевёл xml в словари. Дальше ты в них ищешь что? Наличие каких-то категорий, потом в них подкатегорий? А потом что, если нашёл? Строку туда заносишь или что-то делаешь просто со строкой? Вот это всё похоже на xpath.

Короче, что у тебя должно в конце в самом получиться? Новый xml или что?



Отредактировано py.user.next (Сен. 17, 2017 02:58:04)

Офлайн

#7 Сен. 17, 2017 21:19:48

Stazot
Зарегистрирован: 2017-08-07
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание спиков на лету.

py.user.next
пройти по списку в цикле и искать вхождения уже в другом файле.
например список

  category = {'main_cat1':
                                    {
                                       'sub_cat1':
                                                      {
                                                         'patern1': = '',
                                                         'patern2': =''
                                                      }
                                       'sub_cat2':
                                                      {
                                                         'patern1': = '',
                                                         'patern2': =''
                                                      }
                                     }
'main_cat2':
                                    {
                                       'sub_cat1':
                                                      {
                                                         'patern1': = '',
                                                         'patern2': =''
                                                      }
                                       'sub_cat2':
                                                      {
                                                         'patern1': = '',
                                                         'patern2': =''
                                                      }
                                     }

и потом искать вхождения если в строке есть вхождение из sub_cat1 то парсим её в формат
 string_to_CSV = [main_cat, sub_cat1,name, brand, mark, models]

Офлайн

#8 Сен. 18, 2017 01:51:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10019
Репутация: +  857  -
Профиль   Отправить e-mail  

Создание спиков на лету.

Сделай входной файл с деревом, входной файл со строками, потом сделай выходной файл после обработки всего, запакуй в архив их и прикрепи к сообщению.

Например:
1) У меня есть xml-файл - это первый входной файл.
2) У меня есть ещё какой-то файл со строками - это второй входной файл.
3) По ним я так-то и так-то получаю csv-файл, который мне и нужен - это выходной файл.
Вот эти три файла xml, файл2 и csv запакуй и выложи. Сами эти xml и файл2 могут быть не полными, а просто примерами короткими, чтобы размер архива небольшой был.

Мы не понимаем, что ты пытаешься получить. Ты просто пишешь набор слов каких-то постоянно, метаясь туда-сюда. По коду твоему ясно, что сам ты это не сделаешь. Надо точно установить, из какого состояния в какое ты пытаешься перевести данные, и только после этого пишется программа. Так всегда делают, иначе будешь писать сто разных кодов и ни один не будет правильным.

Stazot
например список
Это не список. Это похоже на словарь словарей. Почему похоже? Потому что это не словарь словарей, так как там есть символы невалидные и запятых нет. Поэтому это и не json. В общем, сомнительно, что у тебя есть какой-то свой неизвестный формат данных. Обычно все форматы известны и описаны в своих документациях. Больше похоже, что ты опять запутался в форматах.

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

Так что подумай, что тебе нужно сделать, и только потом думай, как это можно сделать. А для этого надо сначала сформировать файлы ввода и вывода (входные и выходные данные программы). И на них потом уже делается программа, которая обрабатывает сначала их, а потом и любые входные данные.



Отредактировано py.user.next (Сен. 18, 2017 01:53:36)

Офлайн

#9 Сен. 18, 2017 21:15:26

Stazot
Зарегистрирован: 2017-08-07
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание спиков на лету.

py.user.next
Идея проста. есть CSVшный файл
Шаровые опоры™555;555;SBN252;555-SB-N252_опора шаровая!\ Nissan Navara D40T 07>;SBN252_555
Наконечники рулевых тяг™555;555;SE1651L;555-SE-1651L_наконечник рулевой левый!\ Mazda 3 BK 03>;SE1651L_555;SE-1651L
И так порядка 300 000 строк.
Надо привести к след виду
Двигатель;Шаровые опоры;опора шаровая;Nissan;Navara, D40T 07;SBN252_555
Двигатель;Наконечники рулевых тяг;наконечник рулевой левый;Mazda;3,BK,03
а файл с категориями может быть в любом формате, я просто подумал что для того что бы вложеность описать удобнее Xml формат использовать.
вот и вся идея.
я написал функцию с рекурсией только вот не много ни так работает. Может я что то не допонял?

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
from lxml import etree as et
path_to_xml = r'K:\python\test.xml'
def get_xml_elements_as_dict(node, out_dict ={}):
	tmp_lst =[]
	for element in node:
		if Check_node_child(element):
			out_dict[element.attrib['name']]=get_xml_elements_as_dict(element)
		else:
			tmp_lst.append(element.text)
			out_dict= tmp_lst
	return out_dict
def Check_node_child(node):
	if node.getchildren():
		return 1
	else:
		return 0
def main(args):
	root = et.parse(path_to_xml).getroot()
	result = get_xml_elements_as_dict(root)
	print (result)
    
if __name__ == '__main__':
    import sys
    print (sys.platform)
    sys.exit(main(sys.argv))
сам XML
<root>
<category name = "Электрика">Электрика
<sub_category name = 'Лампы'>
<element>H3</element>
<element>H4</element>
<element>H6</element>
<element>галоген</element>
<element>Ксенон</element>
</sub_category>
<sub_category name = 'Реле'> Реле
<element>реле зажигания</element>
<element>реле поворотников</element>
</sub_category>
</category>
<category name = 'Колеса'>Колеса
<sub_category name = 'Диски'>Диски
<element>R16</element>
<element>R15</element>
<element>R22</element>
<element>R20</element>
<element>R18</element>
</sub_category>
<sub_category name = 'Шины' >Шины
<element>R16/55</element>
<element>R15/55</element>
<element>R22/25</element>
<element>R20/35</element>
<element>R18/33</element>
</sub_category>
</category>
</root>
Вывод
{'Лампы': ['H3', 'H4', 'H6', 'галоген', 'Ксенон'], 'Реле': ['реле зажигания', 'реле поворотников'], 'Электрика': {...}, 'Диски': ['R16', 'R15', 'R22', 'R20', 'R18'], 'Шины': ['R16/55', 'R15/55', 'R22/25', 'R20/35', 'R18/33'], 'Колеса': {...}}
хотя вроде рекурсия должна правильно отработать

Офлайн

#10 Сен. 18, 2017 21:50:49

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Создание спиков на лету.

Stazot

Идея проста. есть CSVшный файл
Шаровые опоры™555;555;SBN252;555-SB-N252_опора шаровая!\ Nissan Navara D40T 07>;SBN252_555
Наконечники рулевых тяг™555;555;SE1651L;555-SE-1651L_наконечник рулевой левый!\ Mazda 3 BK 03>;SE1651L_555;SE-1651L
ты лучше прикрепи кусок реального файла(строк 100), на первый взгляд формат левый какой-то
я написал функцию с рекурсией только вот не много ни так работает. Может я что то не допонял?
в такой функции лучше применять parent - родитель один, а детей неизвестно сколько
 from lxml import etree
def get_node(node,lst):
    txt = ''
    attrib = ''
    parent = 'None'
    tag = node.tag
    if node.getparent() is not None: parent = node.getparent().tag
    d  = node.attrib
    if d: attrib = ','.join([i+':'+ d[i] for i in d])
    if node.text: txt = node.text.strip()
    lst.append([parent,tag,attrib,txt])
    for n in node: get_node(n,lst)
    
xml='''<root>
	<category name = "Электрика">Электрика
		<sub_category name = 'Лампы'>
			<element>H3</element>
			<element>H4</element>
			<element>H6</element>
			<element>галоген</element>
			<element>Ксенон</element>
		</sub_category>
		<sub_category name = 'Реле'> Реле 
			<element>реле зажигания</element>
			<element>реле поворотников</element>
		</sub_category>
	</category>
	<category name = 'Колеса'>Колеса
		<sub_category name = 'Диски'>Диски
			<element>R16</element>
			<element>R15</element>
			<element>R22</element>
			<element>R20</element>
			<element>R18</element>
		</sub_category>
		<sub_category name = 'Шины' >Шины
			<element>R16/55</element>
			<element>R15/55</element>
			<element>R22/25</element>
			<element>R20/35</element>
			<element>R18/33</element>
		</sub_category>
	</category>
</root>
'''
tree = etree.fromstring(xml)
out = []
get_node(tree,out)
print(['parent tag','element tag','attrib','text'])
for i in out:
    print(i)
 >>>
['parent tag', 'element tag', 'attrib', 'text']
['None', 'root', '', '']
['root', 'category', 'name:Электрика', 'Электрика']
['category', 'sub_category', 'name:Лампы', '']
['sub_category', 'element', '', 'H3']
['sub_category', 'element', '', 'H4']
['sub_category', 'element', '', 'H6']
['sub_category', 'element', '', 'галоген']
['sub_category', 'element', '', 'Ксенон']
['category', 'sub_category', 'name:Реле', 'Реле']
['sub_category', 'element', '', 'реле зажигания']
['sub_category', 'element', '', 'реле поворотников']
['root', 'category', 'name:Колеса', 'Колеса']
['category', 'sub_category', 'name:Диски', 'Диски']
['sub_category', 'element', '', 'R16']
['sub_category', 'element', '', 'R15']
['sub_category', 'element', '', 'R22']
['sub_category', 'element', '', 'R20']
['sub_category', 'element', '', 'R18']
['category', 'sub_category', 'name:Шины', 'Шины']
['sub_category', 'element', '', 'R16/55']
['sub_category', 'element', '', 'R15/55']
['sub_category', 'element', '', 'R22/25']
['sub_category', 'element', '', 'R20/35']
['sub_category', 'element', '', 'R18/33']
>>> 

Отредактировано vic57 (Сен. 18, 2017 22:13:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version