我的生成器如下所示:
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])
它将空行输入到文件而不产生任何输出.当我使用相同的生成器将代码插入表时,它完美地工作.
您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]