python转换issu中的JSON到CSV

2024-05-09 12:42:33 发布

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

我正在尝试将一个嵌套的JSON对象文件转换为CSV。 下面是JSON的示例

{
   "total_hosts" : [
      {
         "TYPE" : "AGENT",
         "COUNT" : 6
      }
   ],
   "installed" : [
      {
         "ID" : "admin-4.0",
         "VERSION" : 4,
         "ADDON_NAME" : "Administration"
      },
      {
         "ID" : "admin-2.0",
         "VERSION" : 2,
         "ADDON_NAME" : "Administration"
      },
      {
         "ID" : "ch-5.0",
         "VERSION" : "5",
         "ADDON_NAME" : "Control Host"
      }
   ],
   "virtual_machine" : [
      {
         "COUNT" : 4,
         "TYPE" : "VM"
      }

TYPE,COUNT,ID,VERSION这些都是列,但问题是不是每个对象都有值,有些对象有1个对象有这些值,有些对象有更多的值,所以我写在行中,所以当该列没有值时,我试图写空白。在

将其写入CSV的代码

^{pr2}$

我得到了Index out of range错误,我甚至尝试了True/False条件。在

有人能帮我吗?在

更新:预期输出:

TYPE,COUNT,ID,VERSION,ADDON_NAME,COUNT,TYPE
AGENT,6,admin-4.0,4,Administration,4,VM
 , ,admin-2.0,2,Administration, , 
 , ,cd-5.0,5,Control Host, , 

所以基本上,当列没有值时,我需要空格。在

问题修改:输出:

AGENT,6,,,
 , ,admin-4.0,4,Administration
 , ,admin-2.0,2,Administration
 , ,ch-5.0,5,Control Host

预期产量:

AGENT,6,admin-4.0,4,Administration
 , ,admin-2.0,2,Administration
 , ,ch-5.0,5,Control Host

更新:我甚至试过了

            row.append(str(entry.get('TYPE', '')))
            row.append(str(entry.get('COUNT', '')))
            row.append(str(entry.get('ID', '')))
            row.append(str(entry.get('VERSION', '')))
            row.append(str(entry.get('ADDON_NAME', '')))
            writer.writerow(row)

仍然得到和上面一样的输出。:(


Tags: 对象nameaddonidgetadminversiontype
1条回答
网友
1楼 · 发布于 2024-05-09 12:42:33

这里有两个错误:

  1. 使用decoded['installed']的长度生成一个索引,然后用于decoded['total_hosts']列表。这将生成索引错误,因为decoded['total_hosts']没有那么多条目。

  2. 访问不存在的键将抛出KeyError;使用^{} method来检索值或默认值。

直接在列表上循环简单得多,无需生成索引:

for host in decoded['total_hosts']:
    row = [host.get('TYPE', ''), host.get('COUNT', '')]
    writer.writerow(row)

您可以将其扩展到处理多个键:

^{pr2}$

如果需要组合两个条目的输出,请使用^{}将列表配对,并在较短的列表用完时使用默认值:

from itertools import izip_longest

for t, i, v in izip_longest(decoded['total_hosts'], decoded['installed'], decoded['version'], fillvalue={}):
    row = [t.get('TYPE', ''), t.get('COUNT', ''), 
           i('ID', ''), i('VERSION', ''), i.get('ADDON_NAME', ''),
           v.get('COUNT', ''), v.get('TYPE', '')]
    writer.writerow(row)

这使得三个列表中的任何一个都比其他列表短。在

对于2.6之前的Python版本(添加了itertools.izip_longest),您必须假设installed总是最长的,然后使用:

^{4}$

相关问题 更多 >