代码之家  ›  专栏  ›  技术社区  ›  deep

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

  •  2
  • deep  · 技术社区  · 1 年前

    Ned帮助将具有以下详细信息的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文件中:

    <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

    但是上面的工具将单个行转换为单独的条目,这是不需要的。寻求您的反馈。非常感谢。

    3 回复  |  直到 1 年前
        1
  •  1
  •   Andrej Kesely    1 年前

    如果CSV/XML文件的结构很简单,您可以使用 csv 模块并直接构造字符串(对于更复杂的场景,我建议 lxml / bs4 模块):

    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>
    
        2
  •  1
  •   deep    1 年前
        3
  •  1
  •   Zach Young mo1010    1 年前

    如果您有应该进行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", {k: v for k, v in row.items()})
    
    tree = ET.ElementTree(root)
    ET.indent(tree)
    tree.write("output.xml")
    

    ET.SubElement(root, "entry", {k: v for k, v in row.items()}) 做了大部分实际工作,以及Python的DictReader,将每一行都放入dict中,将行dict中的键值对迭代到入口节点上的属性中:

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