将Python迭代写入JSON文件



我有下面的代码,迭代几个月来创建一个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中包含所有上述月份?

每次执行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)

另一种选择是使用追加模式,并将每个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/

最新更新