我找到了这个简单的CSV读/写的例子。
这段代码读写CSV文件,对第7列进行排序。
import csv
with open('input.csv', newline='') as csvfile:
rdr = csv.reader(csvfile)
l = sorted(rdr, key=lambda x: x[6], reverse=True)
with open('output.csv', 'w') as csvout:
wrtr = csv.writer(csvout)
wrtr.writerows(l)
上面的代码输出一个CSV文件到output.csv
如果我需要做一些除了排序之外的其他处理,我可以通过遍历CSV对象的行来完成。显示该问题的最简单示例只是迭代行并打印它们:
import csv
with open('input.csv', newline='') as csvfile:
rdr = csv.reader(csvfile)
for arow in rdr:
print(arow)
l = sorted(rdr, key=lambda x: x[6], reverse=True)
with open('output.csv', 'w') as csvout:
wrtr = csv.writer(csvout)
wrtr.writerows(l)
上面的代码按照预期将CSV行打印到屏幕上。但是,output.csv文件则为空(0字节)
为什么通过行迭代导致csv.writer没有输出?CSV对象中是否存在某种类型的持久化状态需要重置?
正如@Barmar正确指出的:
rdr是一个迭代器。迭代器只能循环一次。如果您想多次处理它,请将其转换为列表。
工作代码:
import csv
with open('input.csv', newline='') as csvfile:
rdr = csv.reader(csvfile)
mylist = list(rdr)
for arow in mylist:
print(arow)
l = sorted(mylist, key=lambda x: x[6], reverse=True)
with open('output.csv', 'w') as csvout:
wrtr = csv.writer(csvout)
wrtr.writerows(l)