gpt4 book ai didi

python - csv.writer.writerows 需要迭代器?

转载 作者:太空狗 更新时间:2023-10-30 01:14:40 31 4
gpt4 key购买 nike

The documentation对于 writerows 状态

Write all the rows parameters (a list of row objects as described above) to the writer’s file object, formatted according to the current dialect.

这表明 writerows 将列表作为参数。但是它可以带一个迭代器,没问题

python -c 'import csv
> csv.writer(open("test.file.1", "w")).writerows(([x] for x in xrange(10)))
> '
cat test.file.1
0
1
2
3
4
5
6
7
8
9

什么给了?它是否在写入文件之前将迭代器转换为列表,或者文档是否具有误导性并且它实际上可以将迭代器写入文件而不具体化它们?底层代码在C;我无法理解它。

最佳答案

根据sources for csv DictWriter确实 首先创建一个行列表以传递给实际编写器。参见 line 155 :

def writerows(self, rowdicts):
rows = []
for rowdict in rowdicts:
rows.append(self._dict_to_list(rowdict))
return self.writer.writerows(rows)

有趣的是,_csv 模块(C 扩展)中实现的 Writer不需要列表.从源码中我们可以看出,它只是从参数中获取一个可迭代对象并调用 PyIter_Next:

csv_writerows(WriterObj *self, PyObject *seqseq)
{
PyObject *row_iter, *row_obj, *result;

row_iter = PyObject_GetIter(seqseq);
// [...]
while ((row_obj = PyIter_Next(row_iter))) {
result = csv_writerow(self, row_obj);
// [...]
}

请注意,根本不会调用 PyList_* 方法,也不会检查 list 类型。

在任何情况下,both writerows 方法都接受任何可迭代对象,但是 DictWriter 将创建一个(不必要的)中间列表。在以前的版本中,Writer 类可能只接受 list,因此,DictWriter 必须进行该转换,但是现在它已经过时了。

在当前版本的 python 中,DictWriter.writerows 方法可以重新实现为:

def writerows(self, rowdicts):
return self.writer.writerows(map(self._dict_to_list, rowdicts))
# or:
#return self.writer.writerows(self._dict_to_list(row) for row in rowdicts)

应该具有相同的行为,除了避免不必要地创建行列表。

关于python - csv.writer.writerows 需要迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636848/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com