代码之家  ›  专栏  ›  技术社区  ›  Daniel

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

  •  -2
  • Daniel  · 技术社区  · 6 年前

    我正在传输大量数据,由于在完成之前与源断开连接,这些数据需要分块处理。我想在集合中添加元素,直到 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(套) 是1000,然后我将其写入csv。如果这两个条件都不是真的,我还想将其写入csv。不幸的是,当执行时,什么都没写,我相信这可能与潜在的冲突有关 if else 声明。

    1 回复  |  直到 6 年前
        1
  •  2
  •   tdelaney    6 年前

    您应该将最后一个开口移出循环。你有几个虫子,所以我做了一些整理。。。

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

    如果不喜欢两次写入save逻辑,可以使用两个循环

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