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」ファイルでは何も起こりません。しかし、正しい.csvファイルの作成に関係するすべてのものを取り出して別のプログラムに入れると、問題なく動作します. forループを終了する必要がありますか? 両方に同じリーダーを使用することに問題はありますか?

4

2 に答える 2

2

reader入力ファイルが使い果たされている可能性が高いため、インスタンスを再利用する必要があります。

オブジェクトがいつデータを再配信することになっているのかを魔法のように知っていると期待する理由がわかりません。reader

これについてより明確にする必要があります。必要に応じてリーダーを再作成することをお勧めします。

于 2012-12-05T14:57:55.437 に答える
1

それは確かreaderに疲れ果てているという問題ですが。itertoolsこれを修正するためのヘルプと組み合わせて単一の for ループを作成できます。

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 に答える