5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
靭 宏明さんの投稿
(投稿ID: 5402) 添付ファイルのダウンロード権限がありません
靭です。CSVの辞書での読み取りと書き出しで嵌まってしまいました。
やりたいことはCSVを読み込んだ後、IF文で該当しないデ-タを除いて別名ファイルを一部項目だけを対象に
作ることですが、下記メッセージが出てCSVが作成出来ません。
記載コ-ドは下記で、実際に使用したCSVは添付ですがどこに問題があるかご指導いただけないでしょうか
【エラ-文】
小川 慶一さんのコメント
(コメントID: 7896)
まず、前提知識を整理しておきます。
with ... で開いたファイルは、with ブロックが終わったタイミングで自動的に閉じられます。
つまり、以下の[a], [b] は同じ処理です。
そして、closeされたあとにファイルにアクセスしようとするとエラーになります。
csvDictReaderはあくまで「読み込み装置」です。
以下であれば、[1] の段階では、まだ「読み込み準備が整っただけ」で、「読み込み完了状態」ではありません。
実際に読み込みを行うのは、[2]のタイミングです。
ということで、以下のNGとされているコードはエラーになります。
reader が読み込もうとしたファイルはすでに close されているからです。
ということで、ではどのように問題を回避するかというと、以下のどちらかということになるかと思います。
1. with を入れ子にして、読み込んだファイルが自動的に close() される前に書き込みもしてしまう。
2. 読み込んだファイルから得た情報をリストに入れておき、書き込み時は、そのリストから値を読み込む。
1. with を入れ子にして、読み込んだファイルが自動的に close() される前に書き込みもしてしまう。
読み込み用のファイルを close する前に csv.DictReader(file) でひと仕事終えてしまおうということです。
2. 読み込んだファイルから得た情報をリストに入れておき、書き込み時は、そのリストから値を読み込む。
これだと、以下の方針になります。
2-1. csv.DictReader(file) で得られた情報はいったんリストにいておく。
2-2. 読み込み用のファイルは閉じる。
2-3. 書き込み用のファイルを開く。
2-4. 2-1で作ったリストを使って書き込みを行う。
靭 宏明さんのコメント
(コメントID: 7899)
小川 慶一さんのコメント
(コメントID: 7903)
> LISTで書き込む時、この場合はfor 文で書き込む必要があったのですね。
いえ、その理解は適切ではありません。
前の投稿にも書いたとおり、closeされたあとにファイルにアクセスしようとことが問題です。
書き込みの部分は、上記の問題をクリアしていれば、writerowsにリストを渡しても問題なく動きます。
以下のとおりです。
靭 宏明さんのコメント
(コメントID: 7905)