【问题标题】:How to read list in json file from python script如何从python脚本读取json文件中的列表
【发布时间】:2019-01-09 09:13:28
【问题描述】:

问题:1 感谢有人可以进一步建议我。我想使用 python 脚本和 netmiko 模块连接到我的设备。我通过 api 请求获取 ssh 详细信息(json 文件)并使用数据运行脚本。但是我在下面收到错误。我希望有人能给我建议并给我指路。

我在这里错过了一些东西,但我不知道如何解决它。请纠正并引导我。谢谢。

json文件在下面创建为sn-p;

response = requests.post(url,data=data,headers=headers,verify=False)
dictionary_info = response.json() 
with open('devices.json', 'w') as fp:
  json.dump(dictionary_info, fp, indent=4, sort_keys=True)

devices.json 文件如下;

{
"device": [
     {
        "login": "test1",
        "ip": "10.10.10.1",
        "password": "test1",
        "device_type": "cisco_ios"
    },
    {
        "login": "test1",
        "ip": "10.10.10.2",
        "password": "test1",
        "device_type": "cisco_ios"
    },
    {
        "login": "test1",
        "ip": "10.10.10.3",
        "password": "test1",
        "device_type": "cisco_ios"
    },
    {
        "login": "test1",
        "ip": "10.10.10.4",
        "password": "test1",
        "device_type": "cisco_ios"
    }
],
"status": "SUCCESS"
}

当我运行下面的脚本 (sn-p) 时,它会在下面返回一个错误

File "devices.py", line 18, in <module>
print('Connecting to device:',device['ip'])
TypeError: string indices must be integers

for device in devices:
try:
    print('~' * 79)
    print('Connecting to device:',device['ip'])
    connection = netmiko.ConnectHandler(**device)
    print(connection.send_command('show interface'))
    connection.disconnect()
except netmiko_exceptions as e:
    print('Failed to ', device['ip'], e)

我应该能够根据 json 文件提供的 ssh 详细信息对每个设备运行脚本和 ssh。不知何故,代码需要进一步修改,只是我不知道如何。请帮助我。谢谢


我编辑了 devices.json 的内容..我删除了大括号 {}、对象名称 'device' 和 'status' 并且只保留 list[] 如下所示;

   [
    {
        "username": "scnpa",
        "ip": "10.10.10.1",
        "password": "123",
        "device_type": "cisco_ios"
    },
    {
        "username": "scnpa",
        "ip": "10.10.10.2",
        "password": "123",
        "device_type": "cisco_ios"
    },
    {
        "username": "scnpa",
        "ip": "10.10.10.3",
        "password": "123",
        "device_type": "cisco_ios"
    },
    {
        "username": "scnpa",
        "ip": "10.10.10.4",
        "password": "123",
        "device_type": "cisco_ios"
    }
   ]

今天,我只是尝试 n 错误...然后运行脚本并且它可以工作..使用上面的可编辑 json 文件...我知道这不是解决方案,因为最终我将获得我之前共享的 json 文件(带大括号 {} 等)或者有没有办法,我可以得到像上面的格式 [{},{},{},{}]?从 json api 响应创建文件并且只获取 {{},{}.{},{}] 内容...?

或保持原样...

可能需要在for循环部分修改python脚本。我尝试删除设备,但出现不同的错误。将“设备”更改为其他名称,但仍然给我错误“TypeError:字符串索引必须是整数”。 不知道...

for device in devices:
try:
    print('~' * 79)
    print('Connecting to device:',device['ip'])
    connection = netmiko.ConnectHandler(**device)
    print(connection.send_command('show interface'))
    connection.disconnect()


问题:2 我创建单独的帖子

我还有一个关于从 API 读取响应 json 文件(字符串)查询的问题。例如json响应如下

{
"status": "SUCCESS",
"device": [
    {
        "model":"XXXX-A",
        "username": "scnpa1",
        "ip": "10.10.10.1",
        "password": "123",
        "device_type": "cisco_ios"
    },
    {
        "model":"XXXX-A",
        "username": "scnpa2",
        "ip": "10.10.10.2",
        "password": "456",
        "device_type": "cisco_ios"
    }
]

}

如何确保只有特定的键/值,例如名称和密码,并能够将文件打印和创建为 json 文件(列表),可以作为 python 脚本的输入读取。期待下面是这样的

{
"status": "SUCCESS",
"device": [
    {
        "username": "scnpa1",
        "ip": "10.10.10.1",
        "password": "123"
    },
    {
        "username": "scnpa2",
        "ip": "10.10.10.2",
        "password": "456"
    }
]

}

我使用下面的代码,但它会创建包含所有参数的 json 文件

response = requests.post(url,data=data,headers=headers,verify=False)
dictionary_info = response.json() 
with open('devices.json', 'w') as fp:
  json.dump(dictionary_info, fp, indent=4, sort_keys=True)

请给我建议。谢谢

【问题讨论】:

  • 您是否正确加载了文件?你如何创建devices
  • 您好,先生,根据来自 api 的响应调用创建的设备并使用 json.dump()
  • @chenoi 你能展示一下你是如何创建变量devices的吗?另外,请在for 循环之前显示print(devices) 的输出。
  • 嗨,谢谢...问题 1 已解决。我有与从响应 json 中提取特定参数相关的问题 2。也许你可以就这件事给我建议。谢谢
  • 已单独创建问题 2,以更加清晰和集中。谢谢stackoverflow.com/questions/54138775/…

标签: python json api


【解决方案1】:

您应该将循环更改为

for device in devices['mydevice']:

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2013-12-18
    • 2017-08-29
    • 2020-09-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多