16

私はPythonの初心者です。次のスクリプトで2番目の「for」ループが機能しない理由を理解しようとしています。つまり、最初の'for'ループの結果しか取得できず、2番目のループからは何も取得できませんでした。スクリプトとデータcsvを以下にコピーして貼り付けました。

なぜこのようになるのか、2番目の「for」ループを機能させる方法を教えていただければ助かります。

私のスクリプト:

import csv

file = "data.csv"

fh = open(file, 'rb')
read = csv.DictReader(fh)

for e in read:
    print(e['a'])

for e in read:
    print(e['b'])

"data.csv":

a,b,c
tree,bough,trunk
animal,leg,trunk
fish,fin,body
4

2 に答える 2

38

csv リーダーは、ファイルに対する反復子です。一度読んだらファイルの最後まで読むので、もう読むことはありません。もう一度やり直す必要がある場合は、ファイルの先頭にシークできます。

fh.seek(0)

これにより、ファイルが最初にリセットされるため、再度読み取ることができます。コードによっては、フィールド名ヘッダーをスキップする必要がある場合もあります。

next(fh)

DictReaderこれは、フィールド名を決定するために最初にその行を消費し、再びそれを行うつもりはないため、コードに必要です。の他の用途では必要ない場合がありcsvます。

ファイルが大きすぎず、データでいくつかのことを行う必要がある場合は、すべてをリストに読み込むこともできます。

data = list(read)

次に、でやりたいことができますdata

于 2012-06-22T04:27:51.253 に答える
2

私は、csvファイルのパスを取得し、dictのリストを一度に返す小さな関数を作成しました。その後、リストを非常に簡単にループします。

def read_csv_data(path):
    """
        Reads CSV from given path and Return list of dict with Mapping
    """
    data = csv.reader(open(path))
    # Read the column names from the first line of the file
    fields = data.next()
    data_lines = []
    for row in data:
        items = dict(zip(fields, row))
        data_lines.append(items)
    return data_lines

よろしく

于 2012-06-22T05:04:03.943 に答える