我想读取一个CSV文件,并用CSV文件的第二列替换xml文件中的标记。“name”标记值在第一列中。在
A | B
Value1 | ValueX
Value2 | ValueX
Value3 | ValueY
XML结构看起来像。在
^{pr2}$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 should be replaced with 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()
我用的是数组。我可以将值从文件复制到数组中。对于大文件,它需要一个更好的代码。在
考虑使用XSLT,这是一种特殊用途的声明性语言,旨在重组XML文件。与大多数其他通用语言(包括ASP、C、Java、PHP、Perl、VB)一样,Python维护xslt1.0处理器,特别是在其
lxml
模块中。在出于您的目的,您可以动态创建可用于转换的XSLT字符串。唯一需要的循环是循环csv数据:
输出
^{pr2}$相关问题 更多 >
编程相关推荐