はじめに
わりぃ、おれ、死んだ、nikkieです1。
CSV形式のファイルを読み込んで、行を各種データ型に変換する方法を一覧にしていきます!
ドキュメントを見ていたら「これ、どんなデータ型にも変えられるんじゃないか💡」と着想を得たんですよ
目次
本記事の背景
以下のツイートがきっかけです。
Pythonってlistとtuple区別されてるの? やったー!と思って組み込みのcsvモジュールを使ってみたら行がlistで返ってきたときの顔 https://t.co/zCLaCddYVX
— にゃんだーすわん (@tadsan) 2023年4月18日
ポイントは組み込み関数map
listなんですよねー。全部文字列で型が揃う=リストのユースケースだから、なのかなと思ったり
— nikkie にっきー (@ftnext) 2023年4月18日
最近知ったのですが、
map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
という書き方でnamedtupleに変換して読み込めるようですhttps://t.co/vhQM6IG1YU
この記事の主役はmapです!
https://docs.python.org/ja/3/library/functions.html#map
map(function, iterable)
で「function を iterable の全ての要素に適用して結果を生成」します(イテレータが返ります)。
namedtupleのドキュメントを読んでいて知りました2。
CSVファイルを読み込んでデータ型に変換
以下のsome.csv
を読み込みます。
name,price apple,1000 banana,500
(2023/04/21 追記)Python 3.10.9で動作確認しました(追記終わり)
list
(リスト)
csv.reader
で読み込むだけです(きっかけとなったツイートの話ですね)。
dict
(辞書)
csv.DictReader
で変換できます3。
tuple
(タプル)
組み込み関数map
の出番!
csv.reader
が返す要素のリストをmap
でタプルに変換しちゃいましょう。
csv.reader
インスタンスはfor
と一緒に使えるのでイテラブル、つまり、mapのiterable引数に渡せます!
名前付きタプル
名前付きタプルには以下の2つがあると思います。
どちらもmap
で変換できます。
_make
メソッド4がミソですね
collections.namedtuple
https://docs.python.org/ja/3/library/collections.html#collections.namedtuple
typing.NamedTuple
https://docs.python.org/ja/3/library/typing.html#typing.NamedTuple
データクラスのインスタンス
https://docs.python.org/ja/3/library/dataclasses.html#dataclasses.dataclass
いろいろな実装があると思います。
組み込み関数map
のドキュメントでitertools.starmap
を知りました。
関数の入力が引数タプルとして単一のイテラブルの形で整理されている場合は、 itertools.starmap() を参照してください。
https://docs.python.org/ja/3/library/itertools.html#itertools.starmap
そこで今回は行をリストとして読み込み(csv.reader
)、starmap
を使うことにしました。
データクラスにはインスタンスを作成するためのクラスメソッド(=ファクトリ用途)を持たせています5
csv.reader
の返す要素(リスト)をstarmapでアンパックしてファクトリメソッドに渡すので、データクラスのインスタンスに変換されます。
終わりに
CSVの行を各種データ型に変換する方法を一覧にしました。
map
(やitertools.starmap
)が大活躍!
リスト・辞書・タプル・名前付きタプル・データクラスとなんでもござれです🙌
全ては偶然namedtupleのドキュメントでmap
を知ったことによります。
この一覧はCSVファイルに限らず利用できると思うので、今後Pythonを書くのがますます楽しみになってきています!
-
↩ワリィ
— nikkie にっきー (@ftnext) 2023年4月20日
俺、
アメリカ行けなかったわ -
「名前付きタプルは csv や sqlite3 モジュールが返すタプルのフィールドに名前を付けるときにとても便利です:」のところのコード例に
map
が使われています!↩ - 最近ちょうど取り上げました。↩
- https://docs.python.org/ja/3/library/collections.html#collections.somenamedtuple._make↩
- ファクトリメソッドはクラスメソッドでもスタティックメソッドでもよいと考えています(今のnikkieにこだわりはありません)↩