【发布时间】: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。不幸的是,在执行时,没有写入任何内容,我认为这可能与 if 和 else 语句之间的潜在冲突有关。
【问题讨论】:
-
操作系统几乎可以肯定已经缓冲了对磁盘的写入;你的代码中真的需要另一个显式缓冲区吗?
-
使用
writer.writerows([element] for element in chunk)会比循环更快。 -
@chepner -
set丢弃重复项,减小文件大小。 -
写完 1000 个条目后,您并没有清空您的集合。
-
您应该会收到一个错误,因为第一个
if len(chunk) <= 1000:尝试添加element但尚未定义。
标签: python csv export-to-csv