微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

扁平化和组合有序字典的部分

如何解决扁平化和组合有序字典的部分

我已经获取一个 xml 文件并使用 xmltodict 将其更改为一个有序的 dict。它看起来像这样:

XML 文件

<part_report>
    <Metadata>
        <data1>apple</data1>
        <data2>car</data2>
        <data3>date</data3>
    </Metadata>
    <parts>
        <part>
        <data4>people</data4>
        <data5>cats</data5>
        <data6>244234</data6>
        </part>
        <part>
        <data4>children</data4>
        <data5>dogs</data5>
        <data6>342342</data6>
        </part>
    </parts>
</part_report>

OrderedDict

fullFile:    OrderedDict([('part_report',OrderedDict([('Metadata',OrderedDict([('data1','apple'),('data2','car'),('data3','date')])),('parts',OrderedDict([('part',[OrderedDict([('data4','people'),('data5','cats'),('data6','244234')]),OrderedDict([('data4','children'),'dogs'),'342342')])])]))]))])

目标和问题 我需要做的是展平数据。我想将元数据数据与部分中每个部分的parts.part 数据结合起来。难点在于元数据和部分处于同一级别。如果部件是元数据的一个子级别,那么我可以做到这一点。

我一直在努力解决这个问题。我试图在 OrderedDict 中拆分单独的数据(即元数据 + part1、Metadata + part2 等),然后将它们组合起来。它不工作。我在尝试组合它们的第三行到最后一行失败。也许也不是最好的方法。对建议持开放态度。 最终目标是将其放入 dynamodb 数据库中。谢谢!!

这是我的代码

import xmltodict
import json
import boto3
import os
import datetime
from xml.dom import minidom

# load file
with open('dummy.xml','r') as f: 
    #dummyxml ='<root>' +  f.read() + '</root>'
    dummyxml =f.read()
print(dummyxml)
# parse an xml file by name
my_xml = dummyxml

fullFile = xmltodict.parse(my_xml)
print('fullFile:   ',fullFile)
# Serializing json    
json_object = json.dumps(fullFile,indent = 4)   
print('json_object:     ',json_object)  

#want to flatten dictionary by combining Metadata part of dictionary with the individual parts part of dictionary
    
allItems = [];
fullFile = xmltodict.parse(my_xml)
print('fullFile:   ',json_object)  

if("part_report" in fullFile):
    catalog = fullFile["part_report"]
for key,value in catalog.items():
    print('catalog')
    print(key,value) # Metadata orderddict and parts ordereddict
    print()
Metadata_part=catalog["Metadata"]
print('Metadata_part')
print(Metadata_part)
print()
parts_part = catalog["parts"]
print('parts_part')
print(parts_part)
print()

for  key,value in parts_part.items():
    cor=(key,value)
    combo=Metadata_part.update(cor)
    print('combo')
    print()

解决方法

import xml.etree.ElementTree as ET

def process():
    doc = ET.parse("test.xml")

    metadata = []        # stores values from metadata    
    for node in doc.iter('metadata'):
        for elem in node.iter():
            if re.match(r'data\d',elem.tag):
                metadata.append(elem.text)

    parts_list = []     # stores values from parts/parts
    for parts in doc.findall('./parts/'):
        arr = []
        for part in parts:
            arr.append(part.text)
        parts_list.append(arr)

    results = []        # create desired list of tuples
    for arr in parts_list:
        result = tuple(metadata + arr)
        results.append(result)

    return results

output = process()
print(output)

将输出以下内容:

[('apple','car','date','people','cats','244234'),('apple','children','dogs','342342')]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。