Создание одного XML-файла из фрейма данных pandas

#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: