|

ABC DX Tech Internship 2024 参加者募集中!ぜひご応募ください!

2023-05-18

Tips

Pythonでヘッダ付csvを読むならDictReaderがとても便利

Python

PythonのcsvモジュールのDictReader/DictWriterを使う

事の発端: Pythonの各種モジュール、使いこなしきれていない問題

皆さん、ChatGPT 使ってますか?どんな用途においてもとても便利ですよね。

正しいレスポンスを引き出すためのプロンプトエンジニアリングの技術が求められる新時代の到来を日々感じています。

 

実際、私自身もめちゃくちゃ使っています。ちょっとしたスクリプトは抽象化しながらChatGPTに投げたらなんでも教えてくれるのでかなり助かっています。まさに有能な後輩を獲得した気持ちです。(本当はリアルに有能な後輩を獲得したいところですが…)

 

だいたいは自分の想像通りのレスポンスが獲得されますが、ある日、csvで特定のカラムを置換するコードをお願いしてみたところ…

 

Untitled

 

という回答が得られまして、質問文が若干雑なのも気にはなりますが、ここで出てきた 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が試験運用フェーズながら公開されていますし、ますますこれからこの流れは加速していきそうです。

 

ただ、これらの技術は導入すればすべて解決するわけでなくどのように活用するかが重要になります。もちろん間違った回答を得られてしまうこともありますのでそこを見極める能力も必要です。

これからは明確に求められる能力が変わっていく のだろうなあ…と思いを馳せる日々です。

 


この記事の著者

プロフィール画像

伴 拓也

朝日放送グループホールディングス株式会社 DX・メディアデザイン局 デジタル・メディアチーム

アプリケーションからインフラ、ネットワーク、データエンジニアリングまで幅広い守備範囲が売り。最近はデータ基盤の構築まわりに力を入れて取り組む。 主な実績として、M-1グランプリ敗者復活戦投票システムのマルチクラウド化等。