csv DictReader Dictionaryオブジェクトが、ファイルがまだ開いているときにのみ機能するのはなぜですか?

Aug 23 2020

私はPythonを学び、辞書と.csvファイルとcsvモジュールで遊んでいます。このcsv.DictReader()関数は.csvファイルを辞書オブジェクトに変換するのに役立つようですが、私が混乱しているReaderオブジェクトには少し癖があります。

ドキュメントを少し読んだ(そしてcsv.Reader()関数を見上げて答えを見つけようとした)が、それでも少し確信が持てない。

このコードが期待どおりに実行されるのはなぜですか。

with open("cool_csv.csv") as cool_csv_file:
  cool_csv_text = cool_csv_file.read()

print(cool_csv_text)

それでも次のコードは ValueError: I/O operation on closed file.

with open("cool_csv.csv") as cool_csv_file:
  cool_csv_dict = csv.DictReader(cool_csv_file)

for row in cool_csv_dict:
  print(row["Cool Fact"])

DictReaderオブジェクトをPython変数に保存したので、割り当てられた場合のように、ファイルを閉じた後に変数を呼び出すことができるべきではありませんcool cool_csv.read()か?

これをコーディングする適切な方法は次のとおりです。

with open("cool_csv.csv") as cool_csv_file:
  cool_csv_dict = csv.DictReader(cool_csv_file)
  for row in cool_csv_dict:
    print(row["Cool Fact"])

しかし、なぜfor row in cool_csv_dict:セクションをセクションにネストする必要があるのopen()でしょうか。

私の唯一の推測は、csv.DictReader()オブジェクトが実際の辞書(またはそのようなもの)ではないため、どこかを指す必要があるためにいくつかのシェナニガンがあるということです(おそらくそれは「リーダー」の部分ですか?)。

誰かが光を当てることができますか?

回答

2 Barmar Aug 23 2020 at 01:06

csv.DictReadercool_csv_dictオブジェクトの作成時にファイル全体をメモリに読み込まない。CSVから次のレコードを取得するために呼び出すたびに、から次の行が読み取られcool_csv_fileます。したがって、必要に応じて読み取ることができるように、これを開いたままにしておく必要があります。

toの引数csv.DictReaderは、行を返す任意のイテレータにすることができます。したがって、ファイルを開いたままにしたくない場合は、を呼び出しreadlines()てすべての行をリストに入れ、それをに渡すことができます。csv.DictReader

with open("cool_csv.csv") as cool_csv_file:
    cool_csv_lines = cool_csv_file.readlines()
cool_csv_dict = csv.DictReader(cool_csv_lines)
for row in cool_csv_dict:
    print(row("Cool Fact")