Как обрабатывать строки из двух разных файлов параллельно - PullRequest
0 голосов
/ 11 января 2019

Я могу успешно вставить содержимое файла TZ.txt (по одной строке за раз) в строку URL, где находится% s, что отлично работает.

У меня есть данные в формате json, хранящиеся в TZContents.txt, и мне нужно вставить эти данные в скобки полезной нагрузки = '{}' таким же образом, как вставляется содержимое файла TZ.txt. Сейчас это не так, и я чувствую, что это неправильно. Есть предложения?

Меня не беспокоит удаление строк в файле содержимого, как в файле TZ.txt.

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

import requests, meraki, os, json

with open('TZ.txt') as file, open ('TZContents.txt') as file2:
    array = file.readlines()
    array1 = file2.readlines()
    for line in array:
         for line2 in array1:
             line = line.rstrip("\n")
             url = 'https://dashboard.meraki.com/api/v0/networks/%s' %line
             payload = "{%s}" %line2
             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)

Ответы [ 2 ]

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

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

Один из способов сделать это будет:

with open('TZ.txt') as file, open ('TZContents.txt') as file2:
    for line in file1:
        line2 = file2.next()
        ...

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

>>> list(zip(['a', 'b', 'c'], [1, 2, 3]))
[('a', 1), ('b', 2), ('c', 3)]

Так что вместо этого вы можете закодировать его как:

with open('TZ.txt') as file, open ('TZContents.txt') as file2:
    for line, line2 in zip(file1, file2):
        ...

Надеюсь, мы сможем согласиться с тем, что это довольно читабельно и, кажется, проясняет смысл кода.

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

Вам нужно использовать почтовый индекс так:

import requests

with open('TZ.txt') as file:
    tz_lines = file.readlines()

with open ('TZContents.txt') as file2:
    tz_contents = file2.readlines()

for name, contents in zip(tz_lines, tz_contents):
    url = 'https://dashboard.meraki.com/api/v0/networks/%s' % name.rstrip("\n")
    headers = {'X-Cisco-Meraki-API-Key': 'API KEY','Content-Type': 'application/json'}
    response = requests.request('PUT', url, headers=headers, data='{%s}' % contents, allow_redirects=True, timeout = 10)
    print(response.text)

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

if len(tz_lines) != len(tz_contents):
    raise RuntimeError("Files are not the same length!")

Но в идеале вы должны просто хранить все данные вместе. Было бы идеально сохранить все как JSON:

[
  {"name": "the name string", "payload": {"your": "payload"}},
  "more rows"
]

Тогда вы можете использовать json.load(file) в этих with блоках. И запросы имеют хорошую поддержку JSON, так что вы, вероятно, можете передать декодированный JSON непосредственно так же, как вы делали содержимое файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...