我正在尝试将JSON转换为CSV文件,以便进一步分析。我的结构问题是,当我转换JSON文件时,我有很多嵌套的dict/列表。
我尝试使用Pandasjson_normalize()
,但它只平坦的第一级。
import json
import pandas as pd
from pandas.io.json import json_normalize
from cs import CloudStack
api_key = xxxx
secret = xxxx
endpoint = xxxx
cs = CloudStack(endpoint=endpoint,
key=api_key,
secret=secret)
virtual_machines = cs.virtMach()
test = json_normalize(virtual_machines["virtualmachine"])
test.to_csv("test.csv", sep="|", index=False)
你知道如何整平整个JSON文件吗,这样我就可以为单个(在本例中是虚拟机)条目创建CSV文件的单行输入?我尝试了这里发布的几个解决方案,但我的结果总是只有第一级被整平。
这是JSON示例(在本例中,我仍然以JSON格式获得“securitegroup”和“nic”输出:
{
"count": 13,
"virtualmachine": [
{
"id": "1082e2ed-ff66-40b1-a41b-26061afd4a0b",
"name": "test-2",
"displayname": "test-2",
"securitygroup": [
{
"id": "9e649fbc-3e64-4395-9629-5e1215b34e58",
"name": "test",
"tags": []
}
],
"nic": [
{
"id": "79568b14-b377-4d4f-b024-87dc22492b8e",
"networkid": "05c0e278-7ab4-4a6d-aa9c-3158620b6471"
},
{
"id": "3d7f2818-1f19-46e7-aa98-956526c5b1ad",
"networkid": "b4648cfd-0795-43fc-9e50-6ee9ddefc5bd"
"traffictype": "Guest"
}
],
"hypervisor": "KVM",
"affinitygroup": [],
"isdynamicallyscalable": false
}
]
}
9条答案
按热度按时间w41d8nur1#
我使用了以下函数(详细信息可以在here中找到):
不幸的是,这会使整个JSON完全扁平化,这意味着如果您有多层JSON(许多嵌套字典),它可能会将所有内容扁平化为一行,其中包含大量列。
最后,我使用的是
json_normalize()
和我所需要的指定结构。这里有一个很好的例子来说明如何用这种方法。xdyibdwo2#
从https://stackoverflow.com/a/62186053/4355695交叉发布(但随后进一步调整):在本回购协议中:https://github.com/ScriptSmith/socialreaper/blob/master/socialreaper/tools.py#L8,我找到了一个由@roneo对answer posted by @Imran执行的列表包含注解的实现。
我在函数中添加了捕捉空列表和空指令的检查,还添加了打印行,这将帮助人们准确理解函数是如何工作的,您可以通过设置
crumbs=False
来关闭这些打印语句测试:
输出:
这就是我要做的事我把任何复杂的json都扔到这里,它会把它展平。我在原始代码中添加了一个检查来处理空列表
归功于https://github.com/ScriptSmith,我在它的repo中找到了初始扁平化函数。
测试OP的示例json,输出如下:
所以你会看到“tags”和“affinitygroup”键也被处理并添加到输出中,原始代码省略了它们。
2021年5月30日更新:集合。可变Map更改为集合。abc。可变Map
2023年1月11日:已编辑,在第二个项目中添加了分隔符参数。根据@MHebes的建议调用extend()
cbeh67ev3#
IMO accepted answer无法正确处理JSON数组。
如果JSON对象以数组作为值,则应将其扁平化为对象数组,如
而不是向键添加索引。
嵌套对象应该通过连接键(例如,用点作为分隔符)来展平,如
(and这在接受的一个中被正确地完成)。
考虑到所有这些要求,我最终得到了以下内容(在CPython3.5.3中开发和使用):
bfrts1fy4#
如果其他人发现自己在这里,并正在寻找一个更适合随后的方案处理的解决方案:
扁平化列表需要处理列表长度等的标题。我想要一个解决方案,如果有2个列表,例如2个元素,则会生成4行,每个有效的潜在数据行(实际示例见下文):
这将创建更符合关系数据的输出:
如果您在电子表格等中使用csv,并且需要处理展平的数据,则此功能特别有用。
mqkwyuun5#
我尝试使用BFS方法,其中只有当val是dict类型时,我才将(parent,瓦尔)存储在队列中。
它使用给定的JSON,我附加了_来扁平化JSON,而不是使用01列表索引。
它给出了以下输出:
kr98yfug6#
我使用这个简单的函数将数据标准化和扁平化为json,它接受列表、dict、元组并将其扁平化为json。
zengzsys7#
我读过很多不同的方法。这是唯一一个对我来说适用于复杂嵌套JSON的方法。这个方法是将嵌套JSON扁平化并将其转换为Pandas数据框,这样就更容易过滤掉你想要的任何元素。
v2g6jxz68#
以jsonpath格式输出:
00jrzges9#
把字典递过来: