当我尝试运行时
import csv
import sys
import operator
fieldnames = ["A","B","C","D","E"]
surveyfile = open("source.csv", "r")
left_file = open("left.csv",'wb')
right_file = open("right.csv",'wb')
left_reader = csv.DictReader(surveyfile, fieldnames=fieldnames, delimiter=",")
left_writer = csv.DictWriter(left_file, fieldnames, delimiter=",")
sortedlefts = sorted(left_reader,key=lambda x:float(x["B"]))
right_reader = csv.DictReader(surveyfile, fieldnames=fieldnames, delimiter=",")
right_writer = csv.DictWriter(right_file, fieldnames, delimiter=",")
sortedrights = sorted(right_reader,key=lambda x:float(x["B"]), reverse=True)
for row in sortedlefts:
if row["E"] == "l":
left_writer.writerow(row)
for row in sortedrights:
if row["E"] == "r":
right_writer.writerow(row)
“right.csv”文件中没有任何内容。但是,如果我把所有与制作right.csv文件有关的内容放到另一个程序中,它就可以正常工作。我需要结束循环吗?使用相同的阅读器是否有问题?
答案 0 :(得分:2)
输入文件可能已用尽,所以是的,它与重新使用reader
实例有关。
不确定为什么您希望reader
对象神奇地知道它何时应该重新传递数据。
您需要更明确地说明这一点,我建议您根据需要重新创建阅读器。
答案 1 :(得分:1)
虽然reader
已经筋疲力尽,但确实存在问题。您可以创建一个for循环,并结合一些itertools
帮助来解决此问题。
import itertools
left_reader, right_reader = itertools.tee(reader)
sortedlefts = sorted(left_reader,key=lambda x:float(x["B"]))
sortedrights = sorted(right_reader,key=lambda x:float(x["B"]), reverse=True)
for left, right in itertools.izip(sortedlefts, sortedrights):
if left['E'] == 'l':
left_writer.writerow(left)
if right['E'] == 'r':
right_writer.writerow(right)