如何从 python 中的生成器写入 .csv 文件
How to write in .csv file from a generator in python
我的生成器如下所示:
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])
它向文件中输入空行而不产生任何输出。
当我使用相同的生成器将代码插入 table.
时,它工作得很好
你的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]
我的生成器如下所示:
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])
它向文件中输入空行而不产生任何输出。 当我使用相同的生成器将代码插入 table.
时,它工作得很好你的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]