PythonのcsvモジュールのDictReader/DictWriterを使う
事の発端: Pythonの各種モジュール、使いこなしきれていない問題
皆さん、ChatGPT 使ってますか?どんな用途においてもとても便利ですよね。
正しいレスポンスを引き出すためのプロンプトエンジニアリングの技術が求められる新時代の到来を日々感じています。
実際、私自身もめちゃくちゃ使っています。ちょっとしたスクリプトは抽象化しながらChatGPTに投げたらなんでも教えてくれるのでかなり助かっています。まさに有能な後輩を獲得した気持ちです。(本当はリアルに有能な後輩を獲得したいところですが…)
だいたいは自分の想像通りのレスポンスが獲得されますが、ある日、csvで特定のカラムを置換するコードをお願いしてみたところ…
という回答が得られまして、質問文が若干雑なのも気にはなりますが、ここで出てきた csv.Dictreader
を私は今まで使ったことがありませんでした。
勝手ながら、そういう方も多いのではないかと思い、折角の機会なので、今回はその使い方をまとめてみます。
ヘッダ付csvの読み方・書き方
今まで
今までは、ヘッダ付csvファイルから読み込んだ内容をDictのListとして取り込む際、シンプルに下記のようなコードで読み書きしていました。
import csv # ヘッダ付csvをDictとして読み込む with open("sample.csv", "r") as f: csvreader = csv.reader(f) header = next(csvreader) rows = [{k: v for k, v in zip(header, row)} for row in csvreader] # Dictをヘッダ付csvとして書き込む with open("output.csv", "w") as f: csvwriter = csv.writer(f) csvwriter.writerows([header] + [[row.get(c, None) for c in header] for row in rows])
読み込む際にnext(csvreader)
でヘッダを抽出し、それを利用して辞書化を進めるということですね。
リスト内包表記を使うことで短くはできていますが、可読性は…微妙かもしれません。
DictReader / DictWriterを使う場合
import csv # ヘッダ付csvをDictとして読み込む with open("sample.csv", "r") as f: csvreader = csv.DictReader(f) rows = list(csvreader) # Dictをヘッダ付csvとして書き込む with open("output.csv", "w") as f: csvwriter = csv.DictWriter(f, fieldnames=csvreader.fieldnames) csvwriter.writeheader() csvwriter.writerows(rows)
かなりスッキリしました、特に読み込みは一発になるのが大きいですね…
車輪の再発明を防ぐ のはもちろんですが、何よりもこうすることで 可読性が大きく向上する のが大きなメリットだと思います。
DictWriter
については writerows
を使ってまとめて書き込んでいると今一つピンとこないところもありますが、csvモジュールの公式ドキュメントにあるように、
import csv with open('names.csv', 'w', newline='') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
といった形でDict形式のデータを使ってどんどん列を追加していく形での活用時には特に役に立ちそうです。
こういった 頻繁に使うモジュールは公式ドキュメントを暇なときに読んでおくと発見があります ね…
まとめ
今回はChatGPTのレスポンスからPythonのモジュールの隠れた便利機能を発掘した話でした。隠れたというか、ちゃんとドキュメントを読み込んでいれば普通に使えているんでしょうけどね。
どうしても一定のコーディングパターンを獲得してしまうとなかなか新しい知識を仕入れられなくなったりするので、ChatGPTのような仕組みは本当に助かります。昔だと有能な先輩からのレビュー等でしか書き方を見直す機会はなかったでしょう…
弊社ではChatGPTだけでなく、GitHub Copilot等も活用を進めており、この数ヶ月で非常に快適にコーディング出来るようになりました。便利すぎて、これは使っていないと時流に置いていかれるな…と痛感します。
GoogleさんからもBardが試験運用フェーズながら公開されていますし、ますますこれからこの流れは加速していきそうです。
ただ、これらの技術は導入すればすべて解決するわけでなくどのように活用するかが重要になります。もちろん間違った回答を得られてしまうこともありますのでそこを見極める能力も必要です。
これからは明確に求められる能力が変わっていく のだろうなあ…と思いを馳せる日々です。