Форум сайта python.su
Здравствуйте!
/
Есть документ в формате XML с большим количеством данных, который содержит атрибуты элементов, примерно вот так:
<aspect category=“Whole” from=“71” mark=“Rel” sentiment=“neutral” term=“ресторане” to=“80” type=“explicit”/>
Необходимо удалить все атрибуты to= и from=, а остальные перевести в табличку csv. Как-то так чтобы это выглядело в итоге:
term | category | sentiment | mark | type
ресторане |Whole | neutral | Rel | explicit
Помогите, пожалуйста.
Отредактировано dshubenok (Фев. 2, 2015 12:43:16)
Офлайн
кусочек файла скиньте
Офлайн
Как-то так:
import csv import xml.etree.cElementTree as ET xml = ET.parse("xml_file_name") columns = [] with open("result.csv", "wt", encoding="utf-8", newline="") as fout: writer = csv.writer(fout, delimiter="|") for node in xml.findall("aspect"): if not columns: columns = [key for key in node.attrib if key not in ("from", "to")] writer.writerow(columns) writer.writerow(node.get(key) for key in columns)
Отредактировано pyuser (Дек. 7, 2014 05:18:28)
Офлайн
pyuser
Как-то так:
Офлайн
поставьте перед последней строкой один пробел
import csv import xml.etree.cElementTree as ET xml = ET.parse("xml_file_name") columns = [] with open("result.csv", "wt", encoding="utf-8", newline="") as fout: writer = csv.writer(fout, delimiter="|") for node in xml.findall("aspect"): if not columns: columns = [key for key in node.attrib if key not in ("from", "to")] writer.writerow(columns) writer.writerow(node.get(key) for key in columns)
Офлайн
На выход выдает result.csv размером 0 байт.
Прикрепил файл для преобразования.
Прикреплённый файлы: dialog.xml.zip (169,9 KБ)
Офлайн
import csv import xml.etree.ElementTree as ET xml = ET.parse("dialog.xml").getroot() columns = [] with open("result.csv", "wt", encoding="utf-8", newline="") as fout: writer = csv.writer(fout, delimiter="|") for i in xml.findall("review"): for node in i.iter("aspect"): if not columns: columns = [key for key in node.attrib if key not in ("from", "to")] writer.writerow(columns) writer.writerow([node.get(key) for key in columns])
Офлайн
Огромное спасибо!
Офлайн
Снова обращаюсь к вам.
Что нужно допилить, чтобы для каждого термина (атрибута “term”) было указано, сколько раз он встречается с каждой из пяти категорией (атрибут “category”) вместе с одним из трех значений sentiment, нулевая встречаемость тоже учитывается. Например, так:
Food positive: 100 Food negative: 200 Food both: 10 Service positive: 0 Service positive 58 Service both: 0
Всего пять таких категорий (Service, Food, Interior, Price, Whole) и три значения (Positive, Negative, Both).
Слова (term) не нужно приводить к начальной форме, то есть термы “ресторан” и “ресторане” в данном случае должны выступать, как разные термы.
Офлайн
import csv from collections import defaultdict import xml.etree.ElementTree as ET xml = ET.parse("dialog.xml").getroot() result = defaultdict(lambda: {i: {'positive': 0, 'negative': 0, 'both': 0, 'neutral': 0} for i in ['Service', 'Food', 'Interior', 'Price', 'Whole']}, {}) for i in xml.findall("review"): for node in i.iter("aspect"): result[node.attrib['term']][node.attrib['category']][node.attrib['sentiment']] += 1 temp = '\n\t%-10s: positive - %d; negative - %d; both - %d; neutral - %d'*5 for i in result.keys(): a = [] [[a.append(result[i][j][k] if k != None else j) for k in [None, 'positive', 'negative', 'both', 'neutral']] for j in ['Service', 'Food', 'Interior', 'Price', 'Whole']] print i, print temp % tuple(a)
Отредактировано terabayt (Дек. 10, 2014 01:15:32)
Офлайн