写大型CSV文件 - 基于字典的CSV写入器似乎是问题所在
我有一个装满单词的数组(单词和它们的计数),需要把这些写入一个大的平面csv文件。
在测试大约1000个单词时,这个方法运行得很好——我使用了dictwriter,代码如下:
self.csv_out = csv.DictWriter(open(self.loc+'.csv','w'), quoting=csv.QUOTE_ALL, fieldnames=fields)
这里的fields
是单词的列表(也就是我传给csv_out.writerow
的字典中的键)。
但是,随着单词数量的增加,写入一行所需的时间却急剧增加,感觉这个过程变得非常慢。csv
中的dict_to_list
方法似乎是导致我遇到问题的原因。
我现在完全不知道该如何开始优化这个过程?有没有更快的CSV处理方法可以使用?
2 个回答
1
显而易见的优化方法是使用 csv.writer
,而不是 DictWriter
,这样可以直接传入每一行的数据,而不是用字典来表示。这样做有没有帮助呢?
当你提到“单词的数量”时,是指CSV文件中的列数吗?因为我从来没见过需要成千上万列的CSV文件!也许你把数据搞错了,写成了列而不是行?每一行应该代表一个数据项,列则用来定义不同的部分。如果你真的需要那么大的数据量,或许用数据库会更合适一些?
2
好的,这并不是答案,但我查了一下csv模块的源代码,发现里面有一个非常耗时的if not
检查(在python 2.6的第136-141行)。
if self.extrasaction == "raise":
wrong_fields = [k for k in rowdict if k not in self.fieldnames]
if wrong_fields:
raise ValueError("dict contains fields not in fieldnames: " +
", ".join(wrong_fields))
return [rowdict.get(key, self.restval) for key in self.fieldnames]
所以,一个快速的解决办法是,在创建写入器时传入extrasaction="ignore"
。这样做似乎能大大加快速度。
这不是一个完美的解决方案,可能也有点显而易见,但我把这个信息发出来,可能对其他人有帮助。