Python将CSV数据转换为分层XML
我有CSV中的父子数据,我需要使用Python将层次结构转换为XML文件。我到处都搜索过,但大多数解决方案都涉及JSON或JavaScript,与我的问题没有直接关系。如果你知道我错过的答案,请联系我 CSV数据示例: 物种,物种代码,组,组代码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
哺乳动物,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
bygroup\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=" "))