at backyard

Color my life with the chaos of trouble.

Pythonのcsv.DictReaderをlistに食わしたときの挙動についての疑問メモ

Pythoncsv.DictReaderの使い方でよくわからないことメモ

普段からPythonを使っているわけではないので、 pythonista の方々からしたら、こういうのは常識なのかもしれない。
が少しハマったのでメモを残す。

下記のようなコードを書いて実行する。

import csv


def test_dict_reader():
    with open('./csv_file_path.csv') as f:
        data = csv.DictReader(f)
        count = len(list(data))
        print(count)
        for d in data: # ←ここは動かない
            print(d)


if __name__ == "__main__":
    test_dict_reader()

このコード、ループになっている箇所が動かない。
下記のようにコードを修正すると、動かなかったループのところが動くようになる。

import csv


def test_dict_reader():
    with open('./csv_file_path.csv') as f:
        data = csv.DictReader(f)
        # count = len(list(data))
        # print(count)
        for d in data:
            print(d)


if __name__ == "__main__":
    test_dict_reader()

これはPythonの言語仕様が参照渡しであるため、 count = len(list(data)) のところで中身が変わってしまったのだろうと推測している。 ただ、 print(type(data)) でtype名を出してみると、どちらも <class 'csv.DictReader'>が出ていて、本当に中身が異なっているかがどうかがわからない。

また、そもそもlistに変わっていても[{dict}, {dict2}, ...]みたいな形になるので、ループは正常に動くのではないだろうか?

と、ここまで検証したところで力が尽きた...

もしご存知の方がいましたらコメントいただけると幸いです m(_ _)m