#python #python-3.x #xml #pandas #parsing
#python #python-3.x #xml #pandas #синтаксический анализ
Вопрос:
Я хочу создать специально отформатированный XML-файл из заданного фрейма данных pandas. Мой фрейм данных выглядит примерно так —
Doc_ID Doc_Name Doc_Category
abc123 aaa111 c1
abc456 aaa222 c2
И я хочу отформатировать такой набор данных, содержащий 10 тыс. строк, в один XML-файл, имеющий формат —
<DOC>
<DOCNO> abc123 </DOCNO>
<TEXT> aaa111 c1 </TEXT> ### Combines strings from 2 columns
</DOC>
<DOC>
<DOCNO> abc456 </DOCNO>
<TEXT> aaa222 c2 </TEXT> ### Combines strings from 2 columns
</DOC>
Я пытался использовать что-то похожее на это, но мне не удалось объединить их все в один XML-файл.
for i,row in testdoc.iterrows():
xml =['<DOC>']
xml.append('<{0}>{1}</{0}>'.format("DocNO", row["Doc_ID"]))
xml.append('<{0}>{1}</{0}>'.format("Text", row["Doc_Name"] row['Doc_Category']))
xml.append('</DOC>')
Как я могу это сделать? Было бы неплохо также иметь недопустимый обработчик символов.
Спасибо!
Ответ №1:
Попробуйте
import pandas as pd
df = pd.DataFrame(
[{'doc_id': 1, 'doc_name': 'jack', 'doc_cat': '__abc__'}, {'doc_id': 11, 'doc_name': 'ben', 'doc_cat': '$$abc$$'}])
d = df.to_dict(orient='list')
xml = '<ROOT>'
for idx, x in enumerate(d['doc_id']):
xml = '<DOC>'
xml = f'<DOCNO>{x}</DOCNO>'
xml = f'<TEXT>{d["doc_cat"][idx]}{d["doc_name"][idx]}</TEXT>'
xml = '</DOC>'
xml = '</ROOT>'
print(xml)
вывод
<ROOT>
<DOC>
<DOCNO>1</DOCNO>
<TEXT>__abc__jack</TEXT>
</DOC>
<DOC>
<DOCNO>11</DOCNO>
<TEXT>$$abc$$ben</TEXT>
</DOC>
</ROOT>
Ответ №2:
import pandas as pd
df = pd.DataFrame({
'Doc_ID': ['abc123', 'abc456'],
'Doc_Name': ['aaa111', 'aaa222'],
'Doc_Category': ['c1', 'c2']
})
def func(row):
xml = [' <DOC>']
xml.append(' <DOCNO>{0}</DOCNO>'.format(row['Doc_ID']))
xml.append(' <TEXT>{0}{1}</TEXT>'.format(row['Doc_Name'], row['Doc_Category']))
xml.append(' </DOC>n')
return 'n'.join(xml)
xml = '<DOCS>n' ''.join(df.apply(func, axis = 1)) '</DOCS>'
print(xml)
Вывод:
<DOCS>
<DOC>
<DOCNO>abc123</DOCNO>
<TEXT>aaa111c1</TEXT>
</DOC>
<DOC>
<DOCNO>abc456</DOCNO>
<TEXT>aaa222c2</TEXT>
</DOC>
</DOCS>
Комментарии:
1. Большое вам спасибо.
2. Кроме того, я продолжаю получать следующую ошибку при запуске моего скрипта с вышеупомянутой функцией: UnicodeEncodeError: кодек ‘charmap’ не может закодировать символ ‘ u2265’ в позиции 6716874: сопоставление символов с <undefined> . Есть ли способ просто игнорировать такие символы?
3. Возникает ошибка при вызове функции или при записи выходных данных в файл?
4. При записи выходных данных в файл.
5. Попробуйте указать кодировку при открытии файла:
with open('filename', 'w', encoding='utf-8') as f: