Добавьте в набор до полного заполнения, затем напишите в csv перед повторным заполнением набора - PullRequest
0 голосов
/ 27 апреля 2018

Я передаю большое количество данных, которые необходимо обработать порциями из-за отсоединения от источника до завершения. Я хотел бы добавлять элементы в набор до тех пор, пока len(set) не станет равным некоторому числу, скажем 1000. Как только оно достигнет 1000, я бы хотел записать содержимое этого набора в файл CSV для хранения. После написания я хотел бы очистить набор и продолжить добавление элементов, пока процесс не будет завершен. Поскольку конец коллекции, вероятно, не является набором длиной даже 1000, я также хотел бы записать последний набор любого размера <1000 в CSV. </p>

Я пробовал следующее:

import csv    
chunk = set()
for result in source:
    if len(chunk) <= 1000:
        chunk.add(element)
    elif len(chunk) == 1000:
        with open('file.csv', 'a') as csvfile:
            writer = csv.writer(csvfile)
            for element in chunk:
                row = [element]
                writer.writerow(row)
    else:
        with open('file.csv', 'a') as csvfile:        
             writer = csv.writer(csvfile)
             for element in chunk:
                row = [element]
                writer.writerow(row)

Моя логика заключается в том, что я буду добавлять элементы в набор до тех пор, пока len(set) не станет 1000, а затем напишу его в CSV. Если ни одно из условий не выполняется, я хочу также записать его в CSV. К сожалению, при выполнении ничего не пишется, и я полагаю, что это может иметь какое-то отношение к потенциально конфликтующим операторам if и else.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы должны переместить это последнее открытие за пределы цикла. У вас есть пара ошибок, поэтому я немного прибрался ...

import csv

chunk = set()
for result in source:
    chunk.append(result)
    if len(chunk >= 1000):
        with open('file.csv', 'a') as csvfile:
            csv.writer(csvfile).writerows([element] for element in chunk)
            chunk = set()
if chunk:
    with open('file.csv', 'a') as csvfile:
        csv.writer(csvfile).writerows([element] for element in chunk)
        chunk = set()

Если вам не нравится писать логику сохранения дважды, вы можете использовать два цикла

import csv

chunk = set()
source_iter = iter(source)
have_data = True

while have_data:
    for result in source_iter:
        chunk.append(result)
        if len(chunk >= 1000):
            break
    else:
        have_data = False
    with open('file.csv', 'a') as csvfile:
        csv.writer(csvfile).writerows([element] for element in chunk)
    chunk = set()
...