Python 迭代JSON并转换为CSV
我有以下JSON对象: { h:[ { 身份证号码:242611, 分钟:2,, 结果:未命中照片, X:0.9359999847412109, Y:0.534000015258789, xG:0.1072189137339592, 玩家:阿里, h_a:h, 玩家识别码:2930, 情境:OpenPlay, 季节:2018年, 拍摄类型:头部, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:沃德森, 最后行动:有缺口 }, { 身份证号码:242612, 分钟:4,, 结果:SavedShot, X:0.8059999847412109, Y:0.7069999494824218, xG:0.021672379225492477, 玩家:克里斯蒂安·拉姆\u00edrez, h_a:h, 玩家识别码:5477, 情境:OpenPlay, 季节:2018年, 拍摄类型:左脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 玩家:空, 最后行动:无 }, { 身份证号码:242613, 分钟:4,, 结果:SavedShot, X:0.778000305175782, Y:0.505, xG:0.023817993700504303, 球员:毛里西奥·佩雷拉, h_a:h, 玩家识别码:2922, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:维克多·克莱森, 最后一步:通过 }, { 身份证号码:242614, 分钟:17, 结果:未命中照片, X:0.9330000305175781, Y:0.41, xG:0.01863950863480568, 玩家:阿里, h_a:h, 玩家识别码:2930, 情境:从拐角处, 季节:2018年, 拍摄类型:头部, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:毛里西奥·佩雷拉, 最后行动:空中行动 }, { 身份证号码:242617, 分钟:21, 结果:SavedShot, X:0.7109984741211, Y:0.534000015258789, xG:0.015956614166498184, 球员:伊万·伊格纳捷耶夫, h_a:h, 玩家识别码:6025, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:阿里, 最后一步:通过 }, { 身份证号码:242621, 分钟:31, 结果:未命中照片, X:0.7959999847412109, Y:0.4640000152587891, xG:0.03898102045059204, 玩家:维克多·克莱森, h_a:h, 玩家识别码:5478, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 玩家:空, 最后行动:无 }, { 身份证号码:242622, 分钟:36, 结果:未命中照片, X:0.759000015258789, Y:0.350999847412109, xG:0.05237437039613724, 球员:毛里西奥·佩雷拉, h_a:h, 玩家识别码:2922, 情境:直接任意球, 季节:2018年, 拍摄类型:左脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 玩家:空, 最后行动:标准 }, { 身份证号码:242624, 分钟:42, 结果:封杀,, X:0.919000015258789, Y:0.37, xG:0.10843519121408463, 球员:谢尔盖·彼得罗夫, h_a:h, 玩家识别码:2920, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:维克多·克莱森, 最后一步:通过 }, { 身份证号码:242625, 分钟:48, 结果:未命中照片, X:0.7719999694824219, Y:0.385, xG:0.023656079545617104, 球员:亚历山大·马丁诺维奇, h_a:h, 玩家识别码:2790, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:尤里·加津斯基, 最后一步:通过 }, { 身份证号码:242626, 分钟:49, 结果:未命中照片, X:0.715999984741211, Y:0.487999923706055, xG:0.0131189301092321873, 球员:尤里·加津斯基, h_a:h, 玩家识别码:2929, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, pl 艾耶鲁:维克多·克莱森, 最后一步:通过 }, { 身份证号码:242627, 分钟:54, 结果:封杀,, X:0.909000015258789, Y:0.352999923706055, xG:0.09400425851345062, 球员:马格米德·沙皮·苏莱曼诺夫, h_a:h, 玩家识别号:5926, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:维克多·克莱森, 最后一步:通过 }, { 身份证号码:242628, 分钟:54, 结果:封杀,, X:0.8859999847412109, Y:0.3179999237060544, xG:0.061035316437482834, 球员:马格米德·沙皮·苏莱曼诺夫, h_a:h, 玩家识别号:5926, 情境:OpenPlay, 季节:2018年, 拍摄类型:左脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:尤里·加津斯基, 最后一步:通过 }, { 身份证号码:242629, 分钟:55, 结果:目标,, X:0.9269999494824219, Y:0.46, xG:0.523554801940918, 球员:马格米德·沙皮·苏莱曼诺夫, h_a:h, 玩家识别号:5926, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:维克多·克莱森, 最后一步:通过 }, { 身份证号码:242630, 分钟:66, 结果:未命中照片, X:0.915, Y:0.5420000076293945, xG:0.3631550371646881, 球员:克里斯蒂安·库埃娃, h_a:h, 玩家识别码:6799, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:克里斯蒂安·拉姆\u00edrez, 最后行动:十字架 }, { 身份证号码:242631, 分钟:71, 结果:封杀,, X:0.685, Y:0.485, xG:0.03188558667898178, 玩家:克里斯蒂安·拉姆\u00edrez, h_a:h, 玩家识别码:5477, 情境:直接任意球, 季节:2018年, 拍摄类型:左脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 玩家:空, 最后行动:标准 }, { 身份证号码:242632, 分钟:72, 结果:封杀,, X:0.8909999847412109, Y:0.480999847412109, xG:0.09532035887241364, 球员:谢尔盖·彼得罗夫, h_a:h, 玩家识别码:2920, 情境:从拐角处, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 玩家:空, 最后行动:无 }, { 身份证号码:242634, 分钟:75, 结果:目标,, X:0.794000015258789, Y:0.47900001525878905, xG:0.05203503370285034, 球员:伊万·伊格纳捷耶夫, h_a:h, 玩家识别码:6025, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 玩家:空, 最后行动:无 }, { 身份证号码:242640, 分钟:87, 结果:封杀,, X:0.795, Y:0.7330000305175781, xG:0.018532400840137005, 球员:克里斯蒂安·库埃娃, h_a:h, 玩家识别码:6799, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:谢尔盖·彼得罗夫, 最后一步:通过 } ], a:[ { 身份证号码:242615, 分钟:18, 结果:SavedShot, X:0.89, Y:0.427999923706055, xG:0.3485192060470581, 球员:安德烈·帕尤科夫, a:a, 玩家识别码:6138, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:尼古拉·迪米特罗夫, 最后一步:通过 }, { 身份证号码:242616, 分钟:18, 结果:未命中照片, X:0.8719999694824219, Y:0.4, xG:0.30197691917419434, 球员:尼古拉·迪米特洛夫, a:a, 玩家识别码:5496, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 解放军 yer_:空, 最后行动:反弹 }, { 身份证号码:242636, 分钟:79, 结果:封杀,, X:0.8530000305175781, Y:0.3920000076293945, xG:0.042678408324718475, 球员:尤里·巴文, a:a, 玩家识别码:3085, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 玩家:空, 最后行动:无 }, { 身份证号码:242641, 分钟:92, 结果:未命中照片, X:0.705999984741211, Y:0.534000015258789, xG:0.0133125446467368126, 球员:埃里克·比法尔维, a:a, 玩家识别码:5483, 情境:OpenPlay, 季节:2018年, 拍摄类型:右脚, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00, 球员:安德烈·埃戈里切夫, 最后一步:通过 } ]Python 迭代JSON并转换为CSV,python,json,csv,parsing,Python,Json,Csv,Parsing,我有以下JSON对象: { h:[ { 身份证号码:242611, 分钟:2,, 结果:未命中照片, X:0.9359999847412109, Y:0.534000015258789, xG:0.1072189137339592, 玩家:阿里, h_a:h, 玩家识别码:2930, 情境:OpenPlay, 季节:2018年, 拍摄类型:头部, 匹配id:9071, h_队:克拉斯诺达尔队, a_团队:乌拉尔, 大学目标:2, a_目标:0, 日期:2018-12-02 11:00:00,
} 如果不希望将整个JSON响应写入文件,那么应该通过键访问这些值。使用可以将JSON字符串转换为包含列表的字典。例如:
import csv
import json
string = """
{
"h": [
{
"id": "242611",
"minute": "2",
"result": "MissedShots",
"X": "0.9359999847412109",
"Y": "0.534000015258789",
"xG": "0.1072189137339592",
"player": "Ari",
"h_a": "h",
"player_id": "2930",
"situation": "OpenPlay",
"season": "2018",
"shotType": "Head",
"match_id": "9071",
"h_team": "FC Krasnodar",
"a_team": "Ural",
"h_goals": "2",
"a_goals": "0",
"date": "2018-12-02 11:00:00",
"player_assisted": "Wanderson",
"lastAction": "Chipped"
}],
"c": [
{
"id": "242612",
"minute": "4",
"result": "SavedShot",
"X": "0.8059999847412109",
"Y": "0.7069999694824218",
"xG": "0.021672379225492477",
"player": "Cristian Ram\u00edrez",
"h_a": "h",
"player_id": "5477",
"situation": "OpenPlay",
"season": "2018",
"shotType": "LeftFoot",
"match_id": "9071",
"h_team": "FC Krasnodar",
"a_team": "Ural",
"h_goals": "2",
"a_goals": "0",
"date": "2018-12-02 11:00:00",
"player_assisted": null,
"lastAction": "None"
}
]
}
"""
response = json.loads(string)
field_names = response['h'][0].keys() # I'm assuming keys are consistent between h and c for brevity
with open('my_output.csv', 'w', newline='') as outfile:
writer = csv.DictWriter(outfile, fieldnames=field_names)
for key, values in response.items():
writer.writerows(values)
在本例中,我使用了csv模块的类来处理列的排序方式。我们需要传递一个参数fieldnames,告诉模块我们希望如何排列列。我使用了一种快速而肮脏的快捷方式,即通过响应['h'][0]获取字典键。键,但您可以自由传递键名列表。这将用作所有行的模板。在Python<3.6的版本中,这种顺序将不能得到保证,并且可能在代码运行和3.6中发生变化。它在技术上没有保证,但有一个实现细节。假设您的数据包含在一个名为data的变量中: 在写入标题后尝试此循环:
for items in data.values():
for item in items:
writer.writerow(item.values())
如果您不想要h和a,为什么不在代码中使用这些键来获取针对它们存储的列表?如果您可以添加一些注释,例如关于为什么要从响应['h']的第一个条目中提取键,我认为这个答案对请求者会更有帮助。还要注意,还有一个顶级的“a”键,所以您也可以包括写出这些行。@PaulMcG更好吗?
for items in data.values():
for item in items:
writer.writerow(item.values())