Как мне перебрать два списка в API вызове Python 3 - PullRequest
0 голосов
/ 12 января 2019

У меня есть два файла, содержащие информацию, которую мне нужно ввести в одном и том же скрипте. Один содержит идентификаторы, один в каждой строке, а другой список содержит параметры в своих отдельных строках. Следует отметить, что этот список содержит более 4000 строк каждая. Другие вызовы API были успешными, но с этим немного сложнее разобраться.

Способ, которым это должно работать, заключается в том, что скрипт читает строку 1 из файла идентификатора, вставляя этот идентификатор, где% s находится в URL. Это завершит URL, необходимый для вызова API. Затем мне нужны параметры, которые находятся в тех же строках, соответствующих их соответствующим идентификаторам сети, в файле идентификаторов, помещенном в% s в разделе полезной нагрузки.

Я понял это, и сейчас происходит то, когда идентификатор выбирается в списке идентификаторов, URL завершается и делает то, что должен. Однако, когда сценарий начинает чтение файла содержимого, он повторяется снова и снова, пока все параметры для ВСЕХ сетей не будут завершены, и это будет применено только к той одной сети, что не должно происходить, затем он перемещается к следующему идентификатору сети и делает то же самое.

Я опубликовал образец визуального материала, чтобы дать вам представление о том, что получается. Я знаю, что должен быть способ, чтобы они читали по одной строке за раз, запускали скрипт и перебирали следующую строку последовательно, и делали это до тех пор, пока оба полных списка не будут завершены.

Питон не моя сильная сторона, поэтому любая помощь очень ценится. Файлы в формате .txt и правильно отформатированы. Эти данные были проверены с использованием почтальона и были успешны в других наших вызовах API, поэтому мы можем устранить пару факторов.

with open('TZ.txt') as file1, open ('TZContents.txt') as file2:
 array1 = file1.readlines()
 file = file2.readlines()
 for line in array1:
         url = 'https://dashboard.meraki.com/api/v0/networks/%s' %line.rstrip("\n")
         for line2 in file:
             payload = '%s' % line2.rstrip("\n")
             headers = {'X-Cisco-Meraki-API-Key': 'API Key','Content-Type': "application/json"}
             response = requests.request('PUT', url, headers = headers, data = payload, allow_redirects=True, timeout = 10)
             print(response.text)

Пример вывода ниже:

{"id":"1111", "type":"wireless","name":"Network A}
{"id":"1111", "type":"wireless","name":"Network B}
{"id":"1111", "type":"wireless","name":"Network C}
{"errors":["Name has already been taken"]}
{"errors":["Name has already been taken"]}
{"errors":["Name has already been taken"]}
{"errors":["Name has already been taken"]}
{"errors":["Name has already been taken"]}
{"id":"2222", "type":"appliance","name":"Network A}
{"id":"2222", "type":"appliance","name":"Network B}
{"id":"2222", "type":"appliance","name":"Network C}

Должно быть так:

{"id":"1111", "type":"wireless","name":"Network A} 
{"id":"2222", "type":"appliance","name":"Network B}
{"id":"3333", "type":"combined","name":"Network C}

1 Ответ

0 голосов
/ 12 января 2019

Я прочитал ваше описание и думаю, что два файла содержат одинаковое количество строк. Это правильно?

В настоящем коде используется вложенная для итераций, что приводит к избыточному выводу. Вы можете использовать один и тот же индекс, чтобы найти одну и ту же строку в любом файле.

Модифицированный код может быть

with open('TZ.txt') as file1, open ('TZContents.txt') as file2:
    ids = file1.readlines()
    params = file2.readlines()
    n_lines = len(ids)
    for line_num in list(range(n_lines)):
        url = 'https://dashboard.meraki.com/api/v0/networks/%s' %ids[line_num].rstrip("\n")
        payload = '%s' % params[line_num].rstrip("\n")
        headers = {'X-Cisco-Meraki-API-Key': 'API Key','Content-Type': "application/json"}
        response = requests.request('PUT', url, headers = headers, data = payload, allow_redirects=True, timeout = 10)
        print(response.text)
...