添加到集合中直到 "full",然后在再次填充集合之前写入 csv

Add into set until "full", then write to csv before filling set again

由于在完成之前与源断开连接,我正在流式传输大量需要分块处理的数据。我想向集合中添加元素,直到 len(set) 等于某个数字,比如 1000。一旦达到 1000,我想将该集合的内容写入一个 csv 文件进行存储。写完后,我想清空集合并继续添加元素,直到过程完成。因为集合的末尾可能不是一个 1000 长的集合,所以我还想要一种方法来将最后一个集合(无论大小 < 1000)写入 csv。

我试过以下方法:

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。不幸的是,在执行时,什么也没有写,我相信它可能与潜在冲突的 ifelse 语句有关。

您应该将最后打开的那个移到循环之外。你有几个错误,所以我做了一些整理...

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()