为了账号安全,请及时绑定邮箱和手机立即绑定

将损坏的 JSON 转换为 CSV python

将损坏的 JSON 转换为 CSV python

莫回无 2023-03-16 17:14:51
我正在尝试采用格式不正确的 JSON 并将其转换为 CSV。以下是 json 的示例:[  {    "fields": [      {        "label": "starttime",        "field": "starttime",        "type": "integer"      },      {        "label": "endTime",        "field": "endTime",        "type": "integer"      },      {        "label": "duration",        "field": "duration",        "type": "integer"      },      {        "label": "metrics",        "field": "metrics",        "type": "integer"      },      {        "label": "email",        "field": "email",        "type": "string"      },     ]    "results": [      [        15949132375,        15949133139,        763,        7,        "newemail@gmail.com"      ],      [        15949132376,        15949133140,        764,        8,        "newemail1@gmail.com"      ],      [        15949132377,        15949133141,        765,        9,        "newemail2@gmail.com"      ],      [        15949132378,        15949133142,        766,        10,        "newemail3@gmail.com"      ],      [        15949132379,        15949133143,        767,        11,        "newemail4@gmail.com"      ],      [        15949132380,        15949133144,        768,        12,        "newemail5@gmail.com"      ],      [        15949132381,        15949133145,        769,        13,        "newemail6@gmail.com"      ],      [        15949132382,        15949133146,        770,        14,        "newemail7@gmail.com"      ],      [        15949132383,        15949133147,        771,        15,        "newemail8@gmail.com"      ],    ]  }]这是一个样本,因为结果有几千个条目。我需要尝试将上部“字段”部分的值作为标题,并将“结果”放入这些标题下方的行中,因为它们是与“字段”一起使用的数据正如我所说,json 导出不正确,使用密钥以正确的格式获取它不是一个选项。如何将此数据转换为 CSV?如果不是 CSV,如何使用“字段”“标签”作为结果中每个相应行的键,将其格式化为正确的 JSON?我试过只通过 pandas 并创建一个 df。从每个数据集(字段、标签)和结果创建一个列表,无法正确连接它们。
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

可以读取 json 文件,并可以使用“re”模块评估以分隔字段和结果。然后可以将结果写入输出 csv 文件


建议代码:


import re

import csv

with open("sample.json") as fptr :

    fstr = fptr.read()

    #jsonStr = eval(fstr)

    fields = re.findall ('"fields": (\[.*?\])', fstr, re.M+re.S+re.I)

    fields = eval(fields[0])

    headers = [ f['label'] for f in fields]

    results = re.findall ('"results": (\[.*\]).*}', fstr, re.M+re.S+re.I)

    results = eval(results[0])

    # print (fields, results, headers)


with open ("output.csv", "w", newline="") as fptr :

    recordWrite = csv.writer(fptr, dialect='excel')

    recordWrite.writerow(headers)

    recordWrite.writerows(results)

注意:查看上面的 json,可以使用“eval”而不是“re”来评估整个文件内容。唯一需要的更改是在列表结束和“字段”开始后添加一个逗号。


查看完整回答
反对 回复 2023-03-16
  • 1 回答
  • 0 关注
  • 58 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信