从API中,我得到了一个JSON响应作为字典类型。我想将内容写入CSV文件,但失败了。
以下是API响应(缩短,匿名化):
{'total': 99, 'list': [{'id': 'xxxxxxxx', 'name': 'foobar x', 'deleted': False, 'amount': 1234.5}, {'id': 'yyyyyyyy', 'name': 'foobar y', 'deleted': False, 'amount': 2345.6}, {'id': 'zzzzzzzz', 'name': 'foobar z', 'deleted': False, 'amount': 3456.7}]}
字符串
我试过很多方法,但都失败了。我不想要键/值'total'和'list'中的项目。
所有示例都没有{'total': 99, 'list':
部分。
以下是最后一次尝试(缩短):
import csv
my_payload = client.request('GET', 'Opportunity')
field_names = ['id','name','deleted','amount']
print(type(my_payload))
with open('/tmp/test.csv', 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames = field_names)
writer.writeheader()
for data in my_payload:
writer.writerow(my_payload[1])
exit()
型
输出量:
<class 'dict'>
Traceback (most recent call last):
File "/home/martin/bin/espo_get_opportunities.py", line 33, in <module>
writer.writerow(my_payload)
File "/usr/lib/python3.10/csv.py", line 154, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))
File "/usr/lib/python3.10/csv.py", line 149, in _dict_to_list
raise ValueError("dict contains fields not in fieldnames: "
ValueError: dict contains fields not in fieldnames: 'list', 'total
型
1条答案
按热度按时间ljsrvy3e1#
如果响应在顶级字典中总是有一个
'list'
字段,那么你可以循环my_payload["list"]
而不仅仅是mypayload
。循环变量data
将依次包含每个列表项,每个项本身就是一个字典,其键为id
,name
等。因此,您可以在循环中将data
直接写入csv。代码:
字符串
请注意,我在循环中留下了一个调试打印语句来说明发生了什么,对于真实的的代码,您应该删除它。
程序输出:
型
csv文件的内容:
型
但是,我怀疑您从API中获得的实际响应的结构与您显示的字典略有不同,因为您获得了错误消息并使用了
my_payload[1]
。但是,我认为您将能够使用上面概述的一般原则,可能以for data in my_payload[1]['list']
或类似的形式。