为什么这个python代码会与自身冲突?

时间:2012-12-05 14:55:25

标签: python

当我尝试运行时

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文件有关的内容放到另一个程序中,它就可以正常工作。我需要结束循环吗?使用相同的阅读器是否有问题?

2 个答案:

答案 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)