Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 迭代JSON并转换为CSV_Python_Json_Csv_Parsing - Fatal编程技术网

Python 迭代JSON并转换为CSV

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对象:

{ 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, 球员:安德烈·埃戈里切夫, 最后一步:通过 } ]
} 如果不希望将整个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())