Форум сайта python.su
253
FishHookНу у нас наверное разные области приложения xml. Когда оно работает в рамках SOAP конечно нет проблем.
Повторю свою мысль - совершенно плевать, в каком формате передавать данные.
Офлайн
568
doza_and
Товарищи о которых я говорил используют xml для задания начальных условий и параметров для решения задачи коши. Используется xml парсер дает аналог etree Объектов у них много входной файл под 10 мегабайт который они ручками редактируют. И код у них страшненький длиннющая колбаса преобразования в str во float int vector<float> тоже на сотни килобайт. И не поможет тут похоже ОРМ.
Трудно придумать что-то хуже чем засунуть в XML формат.я вас, увы, не понимаю, это похоже на расизм - эмоции есть, а подоплёки нет, кроме апеллирования к каким-то мифическим тибетским монахам, которые вручную пишут тома xmlей
Офлайн
0
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":""}}}
Офлайн
0
FishHook
Как бы ты реализовал. в ручную создаются категории и подкатегории. Затем нужно просмотреть строку и отнести её в определенную подкатегорию которая входит в категорию.
структура такова
категория1затем вывести список по полям
подкатегория1
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
подкатегория2
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
критерий отношения к категории4
категория2
подкатегория1
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
подкатегория2
критерий отношения к категории1
критерий отношения к категории2
критерий отношения к категории3
критерий отношения к категории4
Офлайн
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)
Офлайн
857
StazotПо-моему, ты пытаешься изобрести xpath.
и смотреть есть ли в строке вхождение сначала по категории, потом по под категории. и относить строку к этим категориям если вхождения есть.
Отредактировано py.user.next (Сен. 17, 2017 02:58:04)
Офлайн
0
py.user.next
пройти по списку в цикле и искать вхождения уже в другом файле.
например список
category = {'main_cat1': { 'sub_cat1': { 'patern1': = '', 'patern2': ='' } 'sub_cat2': { 'patern1': = '', 'patern2': ='' } } 'main_cat2': { 'sub_cat1': { 'patern1': = '', 'patern2': ='' } 'sub_cat2': { 'patern1': = '', 'patern2': ='' } }
string_to_CSV = [main_cat, sub_cat1,name, brand, mark, models]
Офлайн
857
Сделай входной файл с деревом, входной файл со строками, потом сделай выходной файл после обработки всего, запакуй в архив их и прикрепи к сообщению.
Например:
1) У меня есть xml-файл - это первый входной файл.
2) У меня есть ещё какой-то файл со строками - это второй входной файл.
3) По ним я так-то и так-то получаю csv-файл, который мне и нужен - это выходной файл.
Вот эти три файла xml, файл2 и csv запакуй и выложи. Сами эти xml и файл2 могут быть не полными, а просто примерами короткими, чтобы размер архива небольшой был.
Мы не понимаем, что ты пытаешься получить. Ты просто пишешь набор слов каких-то постоянно, метаясь туда-сюда. По коду твоему ясно, что сам ты это не сделаешь. Надо точно установить, из какого состояния в какое ты пытаешься перевести данные, и только после этого пишется программа. Так всегда делают, иначе будешь писать сто разных кодов и ни один не будет правильным.
StazotЭто не список. Это похоже на словарь словарей. Почему похоже? Потому что это не словарь словарей, так как там есть символы невалидные и запятых нет. Поэтому это и не json. В общем, сомнительно, что у тебя есть какой-то свой неизвестный формат данных. Обычно все форматы известны и описаны в своих документациях. Больше похоже, что ты опять запутался в форматах.
например список
StazotОни тебе не помогут, потому что ты в целом не можешь точно выразить весь процесс от начала до конца. Они не решают задачу, а выполняют вспомогательную функцию.
выдергивать придется с помощью регулярных выражений.
Отредактировано py.user.next (Сен. 18, 2017 01:53:36)
Офлайн
0
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))
<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'], 'Колеса': {...}}Офлайн
Stazot
Идея проста. есть CSVшный файлты лучше прикрепи кусок реального файла(строк 100), на первый взгляд формат левый какой-то
Шаровые опоры™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
я написал функцию с рекурсией только вот не много ни так работает. Может я что то не допонял?в такой функции лучше применять 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)
Офлайн