解析csv文件以添加详细信息到xml文件

3 投票
2 回答
51 浏览
提问于 2025-04-14 17:19

需要帮助把一个csv文件的内容转换成xml文件。

这个csv文件的格式如下:

name,ip,timeout
domain\user1,10.119.77.218,9000
domain\user2,2.80.189.26,9001
domain\user3,4.155.10.110,9002
domain\user4,9.214.119.86,9003
domain\user5,4.178.187.27,9004
domain\user6,3.76.178.117,9005

从csv文件中提取的内容需要添加到xml文件中,xml文件的格式如下:

<login>
      <entry name="domain\user1" ip="10.119.77.218" timeout="9000"/>
      <entry name="domain\user2" ip="2.80.189.26" timeout="9001"/>
      <entry name="domain\user11" ip="4.155.10.110" timeout="12000"/>
      ...
</login>

因为有很多文件需要转换,所以需要一些脚本来自动处理。我试过这个工具:

https://www.convertcsv.com/csv-to-xml.htm

但是这个工具把每一行都转换成了单独的条目,这样是不需要的。我在寻找你们的建议。谢谢。

2 个回答

2

如果你有一些数据需要进行XML转义,这里有一个简单的入门方法,使用标准的xml.etree模块:

import csv
import xml.etree.ElementTree as ET

root = ET.Element("login")
with open("input.csv", newline="") as f:
    reader = csv.DictReader(f)
    for row in reader:
        ET.SubElement(root, "entry", row)

tree = ET.ElementTree(root)
ET.indent(tree)
tree.write("output.xml")

ET.SubElement(root, "entry", row) 这行代码完成了大部分的实际工作,还有Python的DictReader:每一行的字典都会变成一个条目节点上的属性:

<login>
  <entry name="domain\user1" ip="10.119.77.218" timeout="9000" />
  <entry name="domain\user2" ip="2.80.189.26" timeout="9001" />
  <entry name="domain\user3" ip="4.155.10.110" timeout="9002" />
  <entry name="domain\user4" ip="9.214.119.86" timeout="9003" />
  <entry name="domain\user5" ip="4.178.187.27" timeout="9004" />
  <entry name="domain\user6" ip="3.76.178.117" timeout="9005" />
</login>
1

如果CSV或XML文件的结构比较简单,你可以直接使用csv模块来构建字符串(如果情况比较复杂,我建议使用lxmlbs4模块):

import csv

with open("your_data.csv", "r") as f:
    reader = csv.reader(f)
    header = next(reader)
    data = list(reader)

out = ["<login>"]
for line in data:
    s = " ".join(f'{k}="{v}"' for k, v in zip(header, line))
    out.append(f"\t<entry {s} />")
out.append("</login>")

print(*out, sep="\n")

输出结果是:

<login>
        <entry name="domain\user1" ip="10.119.77.218" timeout="9000" />
        <entry name="domain\user2" ip="2.80.189.26" timeout="9001" />
        <entry name="domain\user3" ip="4.155.10.110" timeout="9002" />
        <entry name="domain\user4" ip="9.214.119.86" timeout="9003" />
        <entry name="domain\user5" ip="4.178.187.27" timeout="9004" />
        <entry name="domain\user6" ip="3.76.178.117" timeout="9005" />
</login>

撰写回答