3

当我尝试跑步时

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

4

2 回答 2

2

输入文件可能已用尽,所以是的,它与重用reader实例有关。

不知道为什么您希望reader对象神奇地知道它应该何时重新传递数据。

您需要对此更加明确,我只是建议根据需要重新创建阅读器。

于 2012-12-05T14:57:55.437 回答
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)
于 2012-12-05T15:02:38.800 回答