Как прочитать список в файле JSON из сценария Python

1

ВОПРОС: 1 Ценю, кто-то может посоветовать мне дальше. Я хочу подключиться к своему оборудованию с помощью скрипта Python и модуля netmiko. Я получаю данные SSH (файл JSON) через запрос API и использовал эти данные для запуска скрипта. Однако я получаю ошибку ниже. Я надеюсь, что кто-то мог посоветовать и показать мне путь.

Я что-то здесь упускаю, но я не знаю, как это решить. Пожалуйста, поправьте и приведите меня. Благодарю.

Файл 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.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"
}

когда я запускаю скрипт ниже (фрагмент), он вернет ошибку ниже

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)

Я должен иметь возможность запускать скрипт и ssh для каждого устройства на основе данных ssh, предоставленных файлом json. Каким-то образом код необходимо изменить дальше, просто я не знаю как. Пожалуйста, помогите мне. Спасибо


Я редактирую содержимое devices.json..Я удаляю фигурную скобку {}, имя объекта 'device' и 'status' и просто остаюсь в списке [] следующим образом;

   [
    {
        "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 error... и запускаю скрипт, и он работает.. с использованием редактируемого файла json выше... Я знаю, что это не решение, так как в итоге я получу файл json, которым я поделился ранее (с curly скобки {} и т.д.) или есть способ, я могу получить как в формате выше [{}, {}, {}, {}]? Создайте файл из ответа json api и получите только содержимое {{}, {}. {}, {}]...?

или оставь формат как есть...

Возможно, нужно изменить скрипт Python в части цикла for. Я пытаюсь удалить устройство, и я получаю другую ошибку. Измените "устройство" на другое имя и все равно выдайте мне ошибку "Ошибка типа: строковые индексы должны быть целыми числами ". Без понятия...

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 СОЗДАЮ ОТДЕЛЬНЫЙ ПОСТ

У меня есть еще вопросы относительно чтения ответного файла (строки) json из API. Например, ответ 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)

Пожалуйста, посоветуй мне. Спасибо

  • 0
    Правильно ли вы загрузили файл? Как вы создаете devices ?
  • 0
    Привет, сэр, устройства созданы на основе ответного вызова API и использования json.dump ()
Показать ещё 3 комментария
Теги:

1 ответ

0
Лучший ответ

Вы должны изменить цикл на

for device in devices['mydevice']:

Ещё вопросы

Сообщество Overcoder
Наверх
Меню