我正在尝试写一个python程序,它可以将任何xml文件作为输入,并将其转换为csv文件,而不会丢失任何xml标签/元素。我愿意使用任何选项,只要它使用python。
我尝试使用xmltodict、json、csv和pandas python模块,能够读取xml并将其转换为字典。但我无法将此字典转换为可以写入csv文件的列表,以确保捕获所有xml字段。
我的示例xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tag_1>
<tag_2>
<date value="06-30-2023">
<data>
<tag_3>val_3</tag_3>
<tag_4>val_4</tag_4>
<tag_5>val_5_1 & val_5_2</tag_5>
<tag_6>-0.157</tag_6>
</data>
<data>
<tag_3>val_3</tag_3>
<tag_4>val_4_2</tag_4>
<tag_5>val_5_1</tag_5>
<tag_6>-0.173</tag_6>
</data>
</date>
</tag_2>
<tag_7>
<date value="06-30-2023">
<data><tag_3>val_3</tag_3><tag_4>val_4</tag_4><tag_5>val_5_1 & val_5_2</tag_5><tag_6>-0.157</tag_6>
</data>
<data><tag_3>val_3</tag_3><tag_4>val_4_2</tag_4><tag_5>val_5_1</tag_5><tag_6>-0.173</tag_6>
</data>
</date>
</tag_7>
</tag_1>
字符串
在阅读了上面的xml之后,我能够将其转换为字典:
{'tag_1':
{'tag_2':
{'date':
{'@value': '06-30-2023',
'data': [{'tag_3': 'val_3', 'tag_4': 'val_4', 'tag_5': 'val_5_1 & val_5_2', 'tag_6': '-0.157'},
{'tag_3': 'val_3', 'tag_4': 'val_4_2', 'tag_5': 'val_5_1', 'tag_6': '-0.173'}
]
}
},
'tag_7':
{'date':
{'@value': '06-30-2023',
'data': [{'tag_3': 'val_3', 'tag_4': 'val_4', 'tag_5': 'val_5_1 & val_5_2', 'tag_6': '-0.157'},
{'tag_3': 'val_3', 'tag_4': 'val_4_2', 'tag_5': 'val_5_1', 'tag_6': '-0.173'}
]
}
}
}
}
型
我的预期输出(在csv文件中)是:
tag_1,tag_2,date,data,tag_3,tag_4,tag_5,tag_6
tag_1,tag_2,06-30-2023,data,val_3,val_4,val_5_1 & val_5_2,-0.157
tag_1,tag_2,06-30-2023,data,val_3,val_4_2,val_5_1,-0.173
tag_1,tag_7,06-30-2023,data,val_3,val_4,val_5_1 & val_5_2,-0.157
tag_1,tag_7,06-30-2023,data,val_3,val_4_2,val_5_1,-0.173
型
到目前为止,我所尝试的:
import xmltodict
import json
import csv
import pandas as pd
with open("file_01.xml", "r", encoding="utf-8") as xml_fh:
str_xml = xml_fh.read()
print(f"str_xml={type(str_xml)}={str_xml}")
dict_xml = xmltodict.parse(str_xml)
print(f"dict_xml={type(dict_xml)}={dict_xml}")
df = pd.DataFrame.from_dict(dict_xml, orient='index')
df.to_csv('file_01.csv', index = False)
型
我得到的实际结果是:
tag_2,tag_7
"{'date': {'@value': '06-30-2023', 'data': [{'tag_3': 'val_3', 'tag_4': 'val_4', 'tag_5': 'val_5_1 & val_5_2', 'tag_6': '-0.157'}, {'tag_3': 'val_3', 'tag_4': 'val_4_2', 'tag_5': 'val_5_1', 'tag_6': '-0.173'}]}}","{'date': {'@value': '06-30-2023', 'data': [{'tag_3': 'val_3', 'tag_4': 'val_4', 'tag_5': 'val_5_1 & val_5_2', 'tag_6': '-0.157'}, {'tag_3': 'val_3', 'tag_4': 'val_4_2', 'tag_5': 'val_5_1', 'tag_6': '-0.173'}]}}"
型
我错过了什么?
2条答案
按热度按时间x6yk4ghg1#
我们可以使用
pd.json_normalize()
来扁平化从XML创建的字典。然而,由于记录位于两个不同的键下:tag_2
和tag_7
,我们需要循环遍历这些特定的标记以获取所有记录,然后连接这些字符串。字符串
这将创建以下CSV文件:
型
也许更主要的方法是规范化每个二级键下的相关子字典。请注意,在下面的代码中,
record_path
和meta
路径不再是列表。型
lvjbypge2#
给定自定义格式,看起来最好的选择是使用嵌套列表解析:
字符串
输出量:
型
CSV输出:
型