【发布时间】:2022-01-23 20:38:27
【问题描述】:
我已经遍历通过 API 查询返回给我的 JSON 对象,并且可以将数据 (obj_key1) 获取到我的 target_csv,但数据显示在第一列,而不是 data 列,我正在尝试指定。
示例 JSON:
[{'obj_key': 0.5,
'obj_key1': 4000,
'obj_key2': '2020-05-01',
'obj_key3': 0.0,
'obj_key4': 'US',
'obj_key5': 50000,
'obj_key6': 11,
'obj_key7': 0.0,
'obj_key8': 20000,
'obj_key9': 0.01,
'obj_key10': '6786547',
'obj_key11': None,
'obj_key12': 12},
{'obj_key': 0.4,
'obj_key1': 5000,
'obj_key2': '2020-05-02',
'obj_key3': 0.0,
'obj_key4': 'US',
'obj_key5': 657435,
'obj_key6': 112,
'obj_key7': 0.0,
'obj_key8': 678548,
'obj_key9': 0.032,
'obj_key10': '6786547',
'obj_key11': None,
'obj_key12': 13},...]
代码:
import csv
import json
import requests
token = {token}
with open('../folder/file.csv') as src, open('target_file.csv', 'w', newline='') as tgt:
reader = csv.reader(src)
writer = csv.writer(tgt)
columns = next(reader)
writer.writerow(columns)
headers = {
'Authorization': token,
'Content-Type': 'application/json; charset=utf-8',
}
for id, name, date, data in reader:
response = requests.get(f'https://{base_url}/api/endpoint?start_date=2021-05-01&end_date=2021-05-15' + '&id=' + str(id),
headers=headers
)
response_data = response.json()
for i in range(len(response_data)):
data = writer.writerows(map(lambda x: [response_data[i]['obj_key1']], range(1)))
预期的 CSV 输出:
| id | name | date | data |
|---|---|---|---|
| 6786547 | Name | 2020-05-01 | 4000 |
| 6786547 | Name | 2020-05-02 | 5000 |
【问题讨论】:
-
您只获得最后一个日期的数据,因为每次执行
data = response_data[i]['obj_key']行时,它都会替换之前的data值——所以在for循环结束时分配的最后一个东西它将是它的价值。 -
@martineau 谢谢,我注意到这就是正在发生的事情。我面临的问题是解决这个问题,因此所有值都添加到 CSV,而不仅仅是替换前一个值的最后一个值。
-
我真的不知道输入数据的格式或 CSV 每一行中的内容,基本上你必须在
data循环内做一些事情 - 也许写一行CSV 或累积值并使用其中一个以上的内容写入行。 -
我用我最近的编辑更新了上面的代码,得到了每个对象的单独数据,但现在它只显示在第一行,所以现在我必须弄清楚如何将其写入特定的“数据”列。
-
如果您编辑了您的问题并展示了 JSON 数据的样子以及转换为 CSV 格式后的样子的示例,将会很有帮助。