Записать куски списка в файл, добавить новую строку в конец куска - PullRequest
0 голосов
/ 25 мая 2020

Проблемы с этим. Я нахожу ТОННУ примеров того, как записывать списки в файл и как разбить список, используя понимание списка, numpy (здесь не применимо) и другие методы, но не то, что я пытаюсь сделать конкретно .

одна из моих функций:

 def createdevstring():
        tree = ET.parse('regcheckdevicelist.xml')
        text = [child.text for child in tree.iter() if not child.text.strip() == '']
        devicename = ",".join(text)
        return devicename

Он анализирует документ xml и удаляет xml. Список text в конечном итоге выглядит следующим образом, хотя список может содержать от 3 до 10 000 +.

Например: ['devicename1', 'devicename2', 'devicename3']

Моя функция в настоящее время принимает эти записи списка и объединяет их с , и хранится в строковой переменной devicename

Результат:

devicename1,devicename2,devicename3,

Это работает нормально, однако я пытается обратиться к API, у которого максимальное количество запросов устройств составляет 200 имен устройств. Если я запрашиваю> 200 устройств, я получаю только 200 в ответе xml.

То, что я пытался ввести в код, но не могу начать работать, это:

Вариант 1 ) Разделите список на подмассивы, содержащие 200 записей из массива tree, причем последний массив представляет собой произвольное число <= 200. Необязательно иметь массивы одинакового размера, просто они могут быть размером не более 200. Затем мне понадобится способ вывести каждый подмассив в строковую переменную, формат которой такой же, как и текущий, строку значений с разделителями-запятыми, а затем запустить <code>requests.request ["POST"....] для каждой построенной строковой переменной cdv.

Вариант 2) Записать элементы списка в файл с ',' между каждым элементом, после того, как 200 будут записаны, добавьте новую строку '\n'. Затем для каждой строки в файле выполните requests.request["POST"....]

Любое указание на это будет fantasti c.

1 Ответ

0 голосов
/ 25 мая 2020

Вот предложение.

Во-первых, вот функция итератора для разделения итерируемого объекта на части.

def chunker(sequence, chunk_size):
    it = iter(sequence)
    while True:
        chunk = []
        try:
            for i in range(chunk_size):
                chunk.append(next(it))
            yield chunk
        except StopIteration:
            if chunk:
                yield chunk
            return

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

def get_text_of_elements():
    tree = ET.parse('regcheckdevicelist.xml')
    return (child.text for child in tree.iter() if not child.text.strip() == '')

И вот что вызывающий может сделать с ней:

for text in chunker(get_text_of_elements(), 200):
    devicename = ",".join(text)
    # do whatever you want with it inside this loop

На самом деле здесь get_text_of_elements возвращает результат в виде генератора, а не создает весь список сразу, хотя, если вы предпочитаете, вы можете вернуть список, изменив его обратно с моих круглых скобок на квадратные. который вы использовали изначально - он все равно будет работать.

Небольшой вариант - поместить преобразование в имя устройства также внутри вашей функции, но сделать это также итератором, а не возвращать значение, поэтому вы затем иметь приятный простой l oop в звонилке:

def get_devicenames(chunk_size=200):
    ET.parse('regcheckdevicelist.xml')
    for text in chunker(
            (child.text for child in tree.iter() if not child.text.strip() == ''),
            chunk_size):
        yield ",".join(text)


for devicename in get_devicenames():
    # ... do something ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...