首页 > 解决方案 > 将 JSON 数据转换为 CSV 电子表格

问题描述

我正在尝试将具有标题和数字数据的 JSON 文件转换为 CSV 文件。我是 python 的超级新手,知道我缺少一些信息,但我不确定我需要寻找什么。

这是我到目前为止尝试过的代码:

import json
import csv

with open('my_json_file.json', 'r') as data:
    global invt_data
    invt_data = json.load(data)

with open('my_csv_file.csv','w') as inverter_data:
    writer = csv.writer(inverter_data)
    writer.writerows(invt_data)

inverter_data.close()

这将写入我想要的文件,但它只创建了三行数据标题,没有任何值。我非常感谢任何帮助或正确方向的指针!谢谢!

我最近编辑了我的代码以尝试一种新方法:

import json
import csv

with open('/Users/cpiephoff/Desktop/2019_09_16_INVT_2.json','r') as data:
     global invt_data
     invt_data = json.load(data)

time_data = invt_data['Timeseries']
power_data = invt_data['power_true_kw']
frequency_data = invt_data['power_frequency']

inverter_data = open('/Users/cpiephoff/Desktop/2019_09_16_INVT_2.csv','w')
csvwriter = csv.writer(inverter_data)

for time in time_data:
    csvwriter.writerows(time.values())

for power in power_data:
    csvwriter.writerows(power.values())

for frequency in frequency_data:
    csvwriter.writerows(frequency.values())

inverter_data.close()

使用这种方法,我的时间序列会引发错误

str 没有属性值

功率和频率数据抛出错误

float 没有属性值

我该如何解决这个问题,以便将数据获取到 csv 文件?

示例 JSON 数据:

{"Timeseries": ["2019-04-01T16:00:00+00:00",
                "2019-04-01T16:01:00+00:00",
                "2019-04-01T16:02:00+00:00"],
 "power_true_kw": [125.5, 127.8, 129.9],
 "power_frequency": [60.0, 59.9, 60.1]}

标签: pythonpython-3.x

解决方案


您有许多长度相等的列表,它们是您的列数据,需要将它们转置为行。

您可以使用zip内置函数来执行此操作:给定一些可迭代对象,它将同时迭代它们,生成包含每个可迭代对象中的第一个元素和每个可迭代对象中的第二个元素的元组,直到用完最短的可迭代对象

>>> cols = ['abc', 'def', 'ghi']
>>> list(zip(*cols))
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]

此技术可应用于数据字典的以生成 csv 文件。

with open('outfile.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    # Write the headers
    writer.writerow(list(invt_data.keys()))
    # Write the data
    writer.writerows(list(zip(*invt_data.values())))

生成此文件:

Timeseries,power_true_kw,power_frequency
2019-04-01T16:00:00+00:00,125.5,60.0
2019-04-01T16:01:00+00:00,127.8,59.9
2019-04-01T16:02:00+00:00,129.9,60.1

推荐阅读