为了账号安全,请及时绑定邮箱和手机立即绑定

将 XML 文件转换为 CSV 文件的有效方法?

将 XML 文件转换为 CSV 文件的有效方法?

婷婷同学_ 2023-08-08 17:54:05
我正在尝试找到一种使用 Python 将 xml 文件转换为 csv 文件的方法。我想这样做,以便脚本能够解析每个警报的 xml 文件(请参阅下面的 xml 片段)。因此,它将创建一个 xls 文件,其中包含 、 、 和 的列,eventType类似于probableCause以下description格式severities:我尝试过的(小样本):from logging import rootfrom xml.etree import ElementTreeimport osimport csvtree = ElementTree.parse('Fault.xml')sitescope_data = open('Out.csv', 'w', newline='', encoding='utf-8')csvwriter = csv.writer(sitescope_data)col_names = ['eventType', 'probableCause', 'description']csvwriter.writerow(col_names)root = tree.getroot()for eventData in root.findall('alarms'):    event_data = []    event = eventData.find('alarm')    event_id = event.find('eventType')    if event_id != None :        event_id = event_id.text    event_data.append(event_id)    csvwriter.writerow(event_data)sitescope_data.close()
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

root = tree.getroot()


def get_uri(elem):

    if elem.tag[0] == "{":

        uri, ignore, tag = elem.tag[1:].partition("}")

        return f"{{{uri}}}"

    return ""


uri = get_uri(root)


def recurse(root):

    for child in root:

        recurse(child)

        print(child.tag)

    for event in root.findall(f'{uri}alarm'):

        event_data = []

        event_id = event.find(f'{uri}eventType')

        if event_id != None :

            event_id = event_id.text

        event_data.append(event_id)


        probableCause = event.find(f'{uri}probableCause')

        if probableCause != None:

            probableCause = probableCause.text

        event_data.append(probableCause)


        severities = event.find(f'{uir}severities')

        if severities:

            severity_data = ','.join([sv.text for sv in severities.findall('f{uri}severity')])

            event_data.append(severity_data)

        else:

            event_data.append("")


        csvwriter.writerow(event_data)

        


recurse(root)

需要注意的事项:

  1. 使用递归遍历 XML

  2. print 语句将显示您的每个标签都有来自根目录中 xmlns 属性的 {urn:nortel:namespaces:mcp:faults} ,这可能是最让您困惑的地方。我添加了一个函数来获取此“uri”文本并将其添加到每个标签前面。

  3. 每次写入 csv 时,您都需要附加多于一列


查看完整回答
反对 回复 2023-08-08
  • 1 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号