当前位置:  开发笔记 > 编程语言 > 正文

如何从python中的生成器写入.csv文件

如何解决《如何从python中的生成器写入.csv文件》经验,为你挑选了1个好方法。

我的生成器如下所示:

def mygen(reader):
    for row in reader:
        yield row[0],row[1],row[2],row[3],row[4]

我试图以下列方式插入这些生成器生成的值:

file1=open(f2,"w")
writes=csv.writer(file1,delimiter=' ',quoting=csv.QUOTE_ALL)
g=mygen(reader)
for x in g:
    writes.writerow([x])

它将空行输入到文件而不产生任何输出.当我使用相同的生成器将代码插入表时,它完美地工作.



1> Martijn Piet..:

x已经是一个序列,您不需要将其包装在一个列表中:

for x in g:
    writes.writerow(x)

您可以直接将您的生成器传递给writes.writerows():

with open(f2, "w") as file1:
    writes = csv.writer(file1, delimiter=' ', quoting=csv.QUOTE_ALL)
    writes.writerows(mygen(reader))

演示:

>>> import sys
>>> import csv
>>> def mygen(reader):
...     for row in reader:
...         yield row[0],row[1],row[2],row[3],row[4]
...
>>> reader = csv.reader('''\
... foo,bar,baz,spam,ham,eggs
... 42,81,13,97,73,100
... '''.splitlines())
>>> writes = csv.writer(sys.stdout, delimiter=' ', quoting=csv.QUOTE_ALL)
>>> writes.writerows(mygen(reader))
"foo" "bar" "baz" "spam" "ham"
"42" "81" "13" "97" "73"

你需要注意你reader不是你已经筋疲力尽的发电机.如果它是一个csv.reader()对象,并且您之前读过所有行,则需要将底层文件对象重新加回到开头fileobj.seek(0).但是,最好避免两次读取文件.

如果您的reader对象生成序列(例如列表或元组),您可以使用切片来获取前5个元素,无需键入每个索引:

def mygen(reader):
    for row in reader:
        yield row[:5]

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有