изменить значение тега при соблюдении условий - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу прочитать CSV-файл.

Первый столбец относится к tag source, второй столбец относится к value source, третий столбец относится к target value для изменения. Последний столбец относится к измененному tag name.

Как я могу сделать это динамически, пожалуйста?

 Types1, Init, INITIAL, Type1

 Types1, inits, INITIAL, Type1

 Types2, ANNULE, delayed, Type2

 Types3, Topp, high, Type3

 Types3, best, TOP, Type3

Пример ввода

<data>
  <db1>
    <Types1> Init </Types1>
    <Types1> inits </Types1>
    <Types3> best </Types3>
  </db1>
  <db1>
    <Types2> ANNULE </Types2>
    <Types3> Topp </Types3>
    <Types3> best </Types3>
  </db1>   
<data>

Ожидаемый результат

<data>
  <db1>
    <Type1> INITIAL </Type1>
    <Type1> INITIAL </Type1>
    <Type3> TOP </Type3>
  </db1>
  <db1>
    <Type2> delayed </Type2>
    <Type3> high </Type3>
    <Type3> TOP </Type3>
  </db1>   

1 Ответ

0 голосов
/ 24 февраля 2020

Для данных CSV, как показано ниже:

enter image description here

Вам необходимо использовать pandas для управления CSV и ElementTree для управления xml файлом .

import xml.etree.ElementTree
import pandas as pd

df = pd.read_csv('data.csv')
root = xml.etree.ElementTree.parse('data.xml')

for tag in df['tag'].unique():
    for item in root.iter(tag):
        text = item.text.strip()
        data_row = df[(df['tag']==tag) & (df['old']==text)]
        item.text = data_row['new'].values[0]

root.write('file_new.xml')

Вывод:

<data>
  <db1>
    <Types1>INITIAL</Types1>
    <Types1>INITIAL</Types1>
    <Types3> best </Types3>
  </db1>
  <db1>
    <Types2>delayed</Types2>
    <Types3> Topp </Types3>
    <Types3> best </Types3>
  </db1>   
</data>
...