json 我如何编写一个特殊的网站响应作为CSV文件的字典?

nhaq1z21  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(85)

从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

ljsrvy3e

ljsrvy3e1#

如果响应在顶级字典中总是有一个'list'字段,那么你可以循环my_payload["list"]而不仅仅是mypayload。循环变量data将依次包含每个列表项,每个项本身就是一个字典,其键为idname等。因此,您可以在循环中将data直接写入csv。
代码:

import csv

my_payload = {'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}]}

field_names = ['id','name','deleted','amount']

print(type(my_payload))

with open('test.csv', 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames = field_names)
    writer.writeheader()
    for data in my_payload['list']:
        print('row: ', data)
        writer.writerow(data)

字符串
请注意,我在循环中留下了一个调试打印语句来说明发生了什么,对于真实的的代码,您应该删除它。
程序输出:

<class 'dict'>
row: {'id': 'xxxxxxxx', 'name': 'foobar x', 'deleted': False, 'amount': 1234.5}
row: {'id': 'yyyyyyyy', 'name': 'foobar y', 'deleted': False, 'amount': 2345.6}
row: {'id': 'zzzzzzzz', 'name': 'foobar z', 'deleted': False, 'amount': 3456.7}


csv文件的内容:

id,name,deleted,amount
xxxxxxxx,foobar x,False,1234.5
yyyyyyyy,foobar y,False,2345.6
zzzzzzzz,foobar z,False,3456.7


但是,我怀疑您从API中获得的实际响应的结构与您显示的字典略有不同,因为您获得了错误消息并使用了my_payload[1]。但是,我认为您将能够使用上面概述的一般原则,可能以for data in my_payload[1]['list']或类似的形式。

相关问题