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

读取 JSON 文件并将其格式化为 CSV

读取 JSON 文件并将其格式化为 CSV

心有法竹 2021-12-17 14:33:37
我必须读取一个 json 文件并提取数据以生成一个 CSV 文件。服务器是 Redhat 7,python 是 Python 2.7.5import timeimport osimport sysimport jsonwith open('abcdc04_abcd11_ig_Host_metrics.json') as data_file:    data = json.load(data_file)with open('abcdc04_abcd11_ig_Host_metrics.txt', 'w') as f:    for row in data:        symmetrixID= row['symmetrixID']        HostID= row['HostID']        HostMBReads= row['HostMBReads']        timestamp= row['timestamp']        joined = ",".join([symmetrixID , HostID, HostMBReads , timestamp])        f.write(joined)结果是:Traceback (most recent call last):  File "./json_scv", line 23, in <module>    symmetrixID= row['symmetrixID']TypeError: string indices must be integers我想要一个像这样的 csv 格式:SymmID,HostName,TimeStamp,HostIOs,HostMBs,ResponseTime,Reads,Writes,HostMBReads,HostMBWrites,ReadResponseTime,WriteResponseTime SyscallCount000123401234,jupiter_ig,1553637600000,0.12666667,0.000494792,0.15257895,0.12666667,0,0.000494792,0,0.15257895,0,0.21333334000123401234,jupiter_ig, 1553637600000,0.1264559,0.000493968,0.15828949,0.1264559,0,0.000493968,0,0.15828949,0,0.123128116000123401234,jupiter_ig,1553637600000,0 ,0,0,0,0,0,0,0,0,0.2
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

您的名称变量data最终应该是字典,而不是列表。因此,当您尝试执行“ for row in data:”时,您是在说“对字典中的每个键执行以下操作”,而不是针对列表中的项目!字典没有排序,但无论哪个键首先被选择为row,该命令都会失败,因为它无法在其中找到任何名为 " symmetrixID" 的内容。HostID例如,如果是循环中选取的第一个键,则row['symmetrixID']表示data['HostID']['symmetrixID']。


如果你仔细观察,字典中只有一个列表可以迭代,那就是data["perf_data"]. 所以尝试那里的循环。


所以暂时把你的数据放在一个字符串中:


s = """

{

  "symmetrixID": "000123401234", 

  "HostID": "jupiter_ig", 

  "perf_data": [

    {

      "HostMBReads": 0.00024720083, 

      "timestamp": 1553637300000, 

      "Writes": 0.0, 

      "ReadResponseTime": 0.15273508, 

      "Reads": 0.06328341, 

      "WriteResponseTime": 0.0, 

      "ResponseTime": 0.15273508, 

      "SyscallCount": 0.09326678, 

      "HostMBWrites": 0.0, 

      "HostIOs": 0.06328341, 

      "MBs": 0.00024720083

    }, 

    {

      "HostMBReads": 0.0004939684, 

      "timestamp": 1553637600000, 

      "Writes": 0.0, 

      "ReadResponseTime": 0.15828949, 

      "Reads": 0.1264559, 

      "WriteResponseTime": 0.0, 

      "ResponseTime": 0.15828949, 

      "SyscallCount": 0.123128116, 

      "HostMBWrites": 0.0, 

      "HostIOs": 0.1264559, 

      "MBs": 0.0004939684

    }, 

    {

      "HostMBReads": 0.0, 

      "timestamp": 1553637900000, 

      "Writes": 0.0, 

      "ReadResponseTime": 0.0, 

      "Reads": 0.0, 

      "WriteResponseTime": 0.0, 

      "ResponseTime": 0.0, 

      "SyscallCount": 0.2, 

      "HostMBWrites": 0.0, 

      "HostIOs": 0.0, 

      "MBs": 0.0

    }

  ], 

  "reporting_level": "Host"

}

"""

这是我如何格式化数据:


import json

data = json.loads(s)


symmetrixID= data['symmetrixID']

HostID= data['HostID']

for row in data['perf_data']:

    HostMBReads = row['HostMBReads']

    timestamp = row['timestamp']

    joined = ",".join([str(c) for c in [symmetrixID, HostID, HostMBReads, timestamp]])

    print(joined)

注意我改变了你的joined表情。如果您不先将所有这些浮点值更改为字符串,join则将不起作用。无论如何,您可以用print您需要的写入命令替换该命令。


查看完整回答
反对 回复 2021-12-17
  • 1 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号