0

次の csv ファイルがあります。

name, sector, year, region, number

bob,,1999,AS,2

bob,hi-tech,,,3

mike,,2001,NE,2

plan,pharma,,,1

「名前」が行とその下の行で同じであるすべてのインスタンスを見つけるスクリプトを作成しました(csvファイルはすでに「名前」の値でソートされています)。現在のスクリプトの出力は次のとおりです。

name, sector, year, region, number

bob,tennis,1999,AS,2+3

bob,tennis,,,3

mike,,2001,NE,2

plan, baseball,,,1

これはほとんど私が欲しいものです。現在のスクリプトの優れている点は、「名前」の値が同じであるすべてのインスタンスを識別し、2 つの行のすべての属性をその名前と組み合わせて、「番号」列を更新することです。私のスクリプトの問題は、新しい行が作成されたら、マージに入る両方の行を削除する必要があることです。上記の例では、2 行目:

bob,tennis,,,3

ここにいてはいけません。以下の実際のスクリプトの関連セクションを再現しました。どなたかが提供できる説明をいただければ幸いです。

for next_row in reader:
        first_name = first_row['name']
        next_name = next_row['name']

        if first_name == next_name:
            if first_row['source'] == '2':
                #get relevant attributes from next_row and add them to first_row

                first_row['number'] = first_row['number'] + ' + ' + next_row['number']
            elif next_row['number'] == '2':
                #get relevant attributes from next_row and add them to first_row

                first_row['number'] = first_row['number'] + ' + ' + next_row['number']
            writer.writerow(first_row)
            first_row = next_row
        else:
            writer.writerow(first_row)

            first_row = next_row
4

1 に答える 1

1

コメントで提案されているように、イテレータを使用することをお勧めしますreaderreaderメソッドがある場合nextは問題ありません。それ以外の場合は、 を使用できますreader=iter(reader)

最初に、あなたの を定義しますfirst_row: あなたは単に行うことができますfirst_row = reader.next().

次に、次から次へとエントリを試すだけです。行を書き、 とfirst_row等しくなくなった場合にのみ更新しますnext_row

イテレータが完全に消費されると、 aStopIterationが発生します。最後に書くだけfirst_rowです。

try:
    while True:
        next_row = reader.next()
        if first_row["name"] == next_row["name"]:
            ...do_something...
        else:
            writer.writerow(first_row)
            first_row = next_row
except StopIteration:
    writer.writerow(first_row)
于 2012-08-28T21:02:58.883 に答える