类型错误:列表索引必须是整数,而不是字典。

25

我的json文件长这样,我正试图在循环中访问元素syslog

{
  "cleanup":{
    "folderpath":"/home/FBML7HR/logs",
    "logfilename":""
  },
  "preparation":{
    "configuration":{
      "src_configfile":"src.cfg",
      "dest_configfile":"/var/home/FBML7HR/etc/vxn.cfg"
    },
    "executable_info1":[
      {
        "login_info":{
          "hostname":"10.4.0.xxx",
          "username":"***",
          "password":"***"
        }
      },
      {
        "command":{
          "folderpath":"/var/home/FBML7HR/SrcCode/vxnservers/fdchost/north/test/hostsim/",
          "processname":"northhostsim",
          "parameters":"-d"
        }
      }
    ],
    "executable_info2":[
      {
        "login_info":{
          "hostname":"10.4.0.xxx",
          "username":"***",
          "password":"***"
        }
      },
      {
        "command":{
          "folderpath":"/var/home/FBML7HR/SrcCode/vxnservers/fdchost/north/build/Linux-2.6.18-194.8.1.el5/bin",
          "processname":"northhost",
          "parameters":"-s brazil -d"
        }
      }
    ],
    "executable_info3":[
      {
        "login_info":{
          "hostname":"10.4.0.xxx",
          "username":"***",
          "password":"***"
        }
      },
      {
        "command":{
          "folderpath":"cd /var/home/xxx/SrcCode/vxnservers/fdchost/north/test/vxnclient_mt",
          "processname":"vxnclient_north_mt",
          "parameters":"0 320 205 14897 16880 60000 60000 2 2"
        }
      }
    ]
  },
  "execution":[
    {
      "test_case":{
        "scriptname":"/var/home/FBML7HR/test/testcase1.sh",
        "testreport":{
          "syslog":"/var/log/messages",
          "backupsyslog":"backuplogs1.txt",
          "clientsimlog":"/var/home/FBML7HR/test/out.log",
          "backupclientsimlog":"Clientlogs1.txt"
        }
      }
    },
    {
      "test_case":{
        "scriptname":"/var/home/FBML7HR/test/testcase2.sh",
        "testreport":{
          "syslog":"/var/log/messages",
          "backupsyslog":"backuplogs2.txt",
          "clientsimlog":"/var/home/FBML7HR/test/out.log",
          "backupclientsimlog":"Clientlogs2.txt"
        }
      }
    }
  ],
  "verification":{
    "testreport":{
      "syslog":"/var/log/messages",
      "backupsyslog":"backuplogs.txt",
      "reportfilename":"/var/home/FBML7HR/test/out.log",
      "backuplogfile":"Clientlogs.txt"
    }
  }
}

我是这样做的:

for i in data['execution']:
    cmd = data['execution'][i]['test_case']['scriptname']

但我收到了一个错误,显示“TypeError: list indices must be integers, not dict”。 我是Python(以及JSON)的新手。请问有人能建议我错在哪里了吗?


1
很明显i是一个dict,所以你不能用它来索引到data['execution']。难道不应该是for i in data['execution']: cmd = i['test_case']['scriptname']吗? - jonrsharpe
1
看起来 data 是一个列表,而不是字典。你确定这个字典没有包含在 [] 中吗? - karthikr
2个回答

45

你正在循环遍历由data['execution']引用的列表中的,而不是索引。

直接使用这些值(字典):

for i in data['execution']:
    cmd = i['test_case']['scriptname']

你可能想要给它一个更有意义的循环名称:

for entry in data['execution']:
    cmd = entry['test_case']['scriptname']

6
  • 你可以尝试这个方法,对我有效
dataArray=data['execution']
for i in range(len(dataArray)):
    cmd = dataArray[i]['test_case']['scriptname']
  • 这个例子完全是按照索引循环,因此不会有任何困惑,
  • 对我来说,这非常简单易懂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接