Я хочу прочитать файл CSV и заменить теги в файле xml вторым столбцом файла CSV. Значения тега «имя» находятся в первом столбце.
A | B
Value1 | ValueX
Value2 | ValueX
Value3 | ValueY
Структура XML выглядит так.
<products>
<product>
<name>Value1</name>
</product>
<product>
<name>Values2</name>
</product>
<product>
<name>Values3</name>
</product>
</products>
Код Python
import csv
import collections
import xml.etree.ElementTree
tree = xml.etree.ElementTree.parse("jolly.xml").getroot()
with open('file.csv', 'r') as f:
reader = csv.DictReader(f)# read rows into a dictionary format
reader = csv.reader(f, dialect=csv.excel_tab)
list = list(reader)
columns = collections.defaultdict(list)# each value in each column is appended to a list
for (k, v) in row.items(): #go over each column name and value
columns[k].append(v)# append the value into the appropriate list
print columns['A']
print columns['B']
for elem in tree.findall('.//name'):
if elem.attrib['name'] == columns['A']:
elem.attrib['name'] == columns['B']
Как я могу справиться с этим?
Вот как выглядит CSV-файл:
Вывод должен выглядеть так:
Value1 следует заменить на ValueX
Хорошо, вот мое решение:
import lxml.etree as ET
arr = ["Value1", "Value2", "Value3"]
arr2 = ["ValuX", "ValuX", "ValueY"]
with open('file.xml', 'rb+') as f:
tree = ET.parse(f)
root = tree.getroot()
for i, item in enumerate(arr):
for elem in root.findall('.//Value1'):
print(elem);
if elem.tag:
print(item)
print(arr2[i])
elem.text = elem.text.replace(item, arr2[i])
f.seek(0)
f.write(ET.tostring(tree, encoding='UTF-8', xml_declaration=True))
f.truncate()
Ну, я использую массив. Я могу просто скопировать значения из файла в массив. Для огромных файлов нужен лучший код.