【问题标题】:Add into set until "full", then write to csv before filling set again添加到集合中直到“满”,然后在再次填充集合之前写入 csv
【发布时间】:2018-04-27 19:18:56
【问题描述】:

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

我尝试了以下方法:

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 语句之间的潜在冲突有关。

【问题讨论】:

  • 操作系统几乎可以肯定已经缓冲了对磁盘的写入;你的代码中真的需要另一个显式缓冲区吗?
  • 使用writer.writerows([element] for element in chunk)会比循环更快。
  • @chepner - set 丢弃重复项,减小文件大小。
  • 写完 1000 个条目后,您并没有清空您的集合。
  • 您应该会收到一个错误,因为第一个 if len(chunk) &lt;= 1000: 尝试添加 element 但尚未定义。

标签: python csv export-to-csv


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多