将Python迭代写入JSON文件

2024-05-15 23:15:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码,它通过几个月的迭代来创建API链接,我的目标是将其导出到JSON文件:

import calendar
from urllib.request import urlopen
import json

year = 2021

for month in range(1, 13):
    r = calendar.monthrange(year, month)
    start = f"{year}-{month:0>2d}-01"
    end = f"{year}-{month:0>2d}-{r[1]}"
    filename = f'data-{year}-{month:0>2d}.json'
    
    url = f"apilink/getKwh?token={token}&clientId={clientId}&siteId={siteId}&from={start}&to={end}"

    response = urlopen(url)
    data = json.loads(response.read())
    jsonString = json.dumps(data)
    jsonFile = open("data.json", "w")
    jsonFile.write(jsonString)
    jsonFile.close()

    #print(jsonString)

打印jsonString给了我以下信息:

{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-01-01 - 2021-01-31", "total_kWh": {"grid_electricity": 708550.8319999998, "pv_electricity": 191839.79899999997}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-02-01 - 2021-02-28", "total_kWh": {"grid_electricity": 696012.9289999999, "pv_electricity": 170749.32900000006}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-03-01 - 2021-03-31", "total_kWh": {"grid_electricity": 760362.3220000002, "pv_electricity": 130641.14300000001}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-04-01 - 2021-04-30", "total_kWh": {"grid_electricity": 708378.577, "pv_electricity": 106324.401}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-05-01 - 2021-05-31", "total_kWh": {"grid_electricity": 687580.101, "pv_electricity": 86021.56199999998}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-06-01 - 2021-06-30", "total_kWh": {"grid_electricity": 698863.9789999999, "pv_electricity": 71402.458}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-07-01 - 2021-07-31", "total_kWh": {"grid_electricity": 715635.6180000001, "pv_electricity": 80797.80699999999}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-08-01 - 2021-08-31", "total_kWh": {"grid_electricity": 692463.586, "pv_electricity": 110086.07599999999}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-09-01 - 2021-09-30", "total_kWh": {"grid_electricity": 20455.919, "pv_electricity": 4785.178}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-10-01 - 2021-10-31", "total_kWh": {"grid_electricity": 0, "pv_electricity": 0}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-11-01 - 2021-11-30", "total_kWh": {"grid_electricity": 0, "pv_electricity": 0}}]}
{"data_json": [{"site": "TEST Western Cape DC", "year": 2021, "month": "2021-12-01 - 2021-12-31", "total_kWh": {"grid_electricity": 0, "pv_electricity": 0}}]}

然而,当它导出到JSON文件时,它只有最后一个月的时间,我怎么能在JSON文件中包含上面所有的月份呢


Tags: testjsondatasitedcyeargridtotal
2条回答

每次执行open("data.json", "w")操作时都会覆盖同一个文件

下面是对代码的重构,首先将所有数据提取到一个列表中,然后将该列表写入文件

import calendar
from urllib.request import urlopen
import json


def get_datas(year):
    for month in range(1, 13):
        r = calendar.monthrange(year, month)
        start = f"{year}-{month:0>2d}-01"
        end = f"{year}-{month:0>2d}-{r[1]}"
        url = f"apilink/getKwh?token={token}&clientId={clientId}&siteId={siteId}&from={start}&to={end}"
        response = urlopen(url)
        data = json.loads(response.read())
        yield data


datas = list(get_datas(2021))
with open("data.json", "w") as f:
    json.dump(datas, fp)

另一个选项是使用append模式,将每个JSON对象写在自己的一行上,这样您就得到了一个JSONLines/ndjson文件

根据评论进行编辑

为了得到多年

datas = []
for year in (2020, 2021):
    datas.extend(get_datas(year))
# write to file...

您正在覆盖该文件。您应该使用附加模式open("data.json", "a")

请阅读下面的链接,了解python中的基本文件处理

https://www.geeksforgeeks.org/file-handling-python/

相关问题 更多 >