Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将CSV数据转换为分层XML_Python_Xml_Pandas_Csv_Transformation - Fatal编程技术网

Python将CSV数据转换为分层XML

Python将CSV数据转换为分层XML,python,xml,pandas,csv,transformation,Python,Xml,Pandas,Csv,Transformation,我有CSV中的父子数据,我需要使用Python将层次结构转换为XML文件。我到处都搜索过,但大多数解决方案都涉及JSON或JavaScript,与我的问题没有直接关系。如果你知道我错过的答案,请联系我 CSV数据示例: 物种,物种代码,组,组代码 哺乳动物,00,动物,0, 熊,01,哺乳动物,00 马,02,哺乳动物,00, 猫,03,哺乳动物,00, 北极熊,011,北极熊,01, 灰熊,012,熊,01, 帕洛米诺,021,马,02, 孟加拉虎,031,猫,03, 美洲狮,032,猫,03

我有CSV中的父子数据,我需要使用Python将层次结构转换为XML文件。我到处都搜索过,但大多数解决方案都涉及JSON或JavaScript,与我的问题没有直接关系。如果你知道我错过的答案,请联系我

CSV数据示例:

物种,物种代码,组,组代码
哺乳动物,00,动物,0,
熊,01,哺乳动物,00
马,02,哺乳动物,00,
猫,03,哺乳动物,00,
北极熊,011,北极熊,01,
灰熊,012,熊,01,
帕洛米诺,021,马,02,
孟加拉虎,031,猫,03,
美洲狮,032,猫,03,
猞猁,033,猫,03
加拿大猞猁,0331,猞猁,033

此数据应转换为XML,父组和子组的排列方式如下:

  <group>
            animals
            <group_code> 0 </group_code>
            <species>
                mammals
                <species_code > 00 </species_code>
            </species >
        </group>
        <group>
            mammals
            <group_code > 00 </group_code>
            <species>
                bears
                <species_code> 01 </species_code>
            </species>
            <species>
                horses
                <species_code> 02 </species_code>
            </species>
            <species>
                cats
                <species_code> 03 </species_code>
            </species>
        </group>
        <group>
            bears
            <group_code > 01 </group_code>
            <species>
                polar_bear
                <species_code> 011 </species_code>
            </species>
            <species>
                grizzly bear
                <species_code> 012 </species_code>
            </species>  

动物
0
哺乳动物
00
哺乳动物
00
熊
01
马
02
猫
03
熊
01
北极熊
011
灰熊
012


对于数据集中的父子关系,模式应保持一致。非常感谢您能提供的任何帮助。这方面我还是个新手,非常感谢你能提供的任何新知识。

这提供了你想要的熊猫的输出,你可以迭代熊猫的结果。groupby(),它返回类似于
(group,df[df['grouped\u column']==group])
元组的列表

我还将
groupby
by
group\u code
的结果作为字符串进行排序,这样就可以按字典顺序对其进行排序,从而根据示例输出实现您需要的“层次结构”(我不确定是否需要,也许您可以简单地将列作为整数进行排序)

print(…)
行将精确打印您在问题中提出的内容(至少在结构上,没有缩进和换行),而
xml_树….
行将创建一个包含所有组的xml文件,但包装在
根元素中。不过,它仍然在写入文件时没有任何缩进/换行

如果xml输出应包括缩进/换行:


据我所知,这正是你所要求的(包装在
根标签中)。

我担心这会给你带来一些代码。我不确定是否存在将数据直接转换成这种格式的情况。你试过什么?@roganjosh:我试着用Pandas创建一个层次索引,然后将字符串写入必要的XML位置。我无法让它工作,但如果它提供了正确的解决方案,我不怕很多代码。我不知道从哪里开始。我害怕很多代码:)你应该提供一个并展示你自己的尝试来解决这个问题。你应该考虑的是数据结构,而不是文件格式。抽象地考虑,数据结构是什么样的数据恰好被存储为CSV。您可以将其视为行列表或列列表。接下来考虑一下您的分层数据结构(我想到了字典),以及如何使用Python中的简单内置类型从一个数据结构转换到另一个数据结构。实际的序列化格式(CSV、XML、JSON等)在很大程度上与您的问题无关(尽管某些格式比其他格式更适合某些类型的数据结构)@roganjosh:谢谢,我回到办公室后会提供MCVE。不要将工作存储在这台机器上。谢谢@Unaiel!这正是我需要的。一个问题:如何解析输出?当我打印此解决方案时,我得到:“[,,]”
import pandas as pd
import io
import csv
from xml.etree.ElementTree import Element, SubElement, tostring, ElementTree

sample_csv = io.StringIO("""
species, species_code, group, group_code
mammals, 00, animals, 0
bears, 01, mammals, 00
horses, 02, mammals,00
cats, 03, mammals, 00
polar bear, 011, bears, 01
grizzly bear, 012, bears, 01
palomino, 021, horses, 02
bengal tiger, 031, cats, 03
cougar, 032, cats, 03
lynx, 033, cats, 03
canada_lynx, 0331, lynx, 033""")

df = pd.read_csv(sample_csv, dtype=str)
df.columns = [col.strip() for col in df.columns]
for col in df.columns:
    df[col] = df[col].str.strip()

groups = Element('groups')
xml_tree = ElementTree(groups)

for group_group_code, df in sorted(df.groupby(['group', 'group_code']), key=lambda grp: grp[0][1]):
    group, group_code = group_group_code
    xml_group = Element('group')
    xml_group.text = group.strip()
    xml_group_code = SubElement(xml_group, 'group_code')
    xml_group_code.text = group_code.strip()
    for row in df[['species', 'species_code']].itertuples():
        xml_species = SubElement(xml_group, 'species')
        xml_species.text = row.species
        xml_species_code = SubElement(xml_species, 'species_code')
        xml_species_code.text = row.species_code
    groups.append(xml_group)

print(b''.join(tostring(gr) for gr in groups))
xml_tree.write('groups_test.xml')
from xml.dom import minidom

print(xml.dom.minidom.parseString(tostring(groups)).toprettyxml(indent="    "))