Python学習【365日チャレンジ!】280日目のマスターU(@Udemy11)です。
寒くなると釣りに行くモチベーションが下がってしまいます。
もちろん水温も下がるので、魚たちはより安定した水温を求めて深場に移動するらしく、ぽかぽか陽気の秋に比べると釣果もかなり落ちてしまうんですよね。
10月には絶好調だったアオリイカもなかなかつれなくなって、年越しそば用のイカ天を確保しておこうと思っていたのに未だに確保できていません。
暖かい黒潮が流れる本州最南端の串本へ行ってみたいんですが、いつのことになるやら。。。
それでは今日も、Python学習を始めましょう。
昨日の復習
昨日は、タプルを拡張させたような使い方ができるnamedtuple
を学習しました。
タプルは値を変更できないのが特徴ですが、同じような機能を持ったオブジェクトを作成できるのがnamedtuple
です。
namedtuple
の追加メソッドである_make
や_replace
は、他のメソッドとのコンフリクトを避けるため、先頭に_(アンダースコア)
がついていました。
namedtuple
の基本については、昨日の記事をごらんください。
今日は、namedtuple
を使ってCSVファイルを活用する学習します。
CSVの復習
CSVファイルの取り扱いは、こちらの記事で学習しました。
CSVファイルからnamedtuple
に値を取り込んで活用することができるのですが、CSVファイルの扱いを少し復習しておきましょう
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['first', 'last', 'type']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first': 'Master', 'last': 'U', 'type': 'male'})
writer.writerow({'first': 'Taro', 'last': 'Yamada', 'type': 'male'})
writer.writerow({'first': 'Hanako', 'last': 'Tanaka', 'type': 'female'})
with open('names.csv', 'r') as f:
csv_reader = csv.reader(f)
header = next(csv_reader)
for row in csv_reader:
print(row[0], row[1], row[2])
最初にCSVファイルを作成して、値を書き込んでいきます。
3行目でwith
ステートメントでCSVファイル(named.csv
)を書き込みモードで作成し、2行目でヘッダの名前を変数fieldnames
に代入しています。
4行目でwiter
オブジェクトを作成して、5行目でヘッダを、6行目から8行目でそれぞれの値を書き込んでいます。
10行目からは作成したCSVファイルを読み込んで、出力します。
10行目で作成したnames.csv
を読み込みで開き、11行目でcsv_reader
オブジェクトを生成します。
12行目は、ヘッダの出力をスキップするコードです。
13行目、14行目でfor
ループを使って、CSVに入力されてる値を取り出して出力しています。
出力結果
Master U male
Taro Yamada male
Hanako Tanaka female
14行目の出力コードは、print(row)
だけでも出力できますが、['Master', 'U', 'male']
のように、リストで3行表示されます。
namedtuple
続いてnamedtuple
を使って同じ結果を出力してみます。
with open('names.csv', 'r') as f:
csv_reader = csv.reader(f)
Names = collections.namedtuple('Names', next(csv_reader))
for row in csv_reader:
names = Names._make(row)
print(names.first, names.last, names.type)
先ほどのコードの2行目にimport collections
を追加していますが、便宜上省略して、12行目からのコードだけ記述しています。
13行目までのcsv_reader
オブジェクトを作るまでは同じコードになり、14行目でnamedtuple
を使って、CSVに書き込んだヘッダーfieldnames
をnext(csv_reader)
で引数field_name
に指定して、Names
という名前のサブクラスを作成します。
あとは、15行目でfor
ループを使って_make
でnames
オブジェクトに値を入れて、16行目のprint
でそれぞれのフィールドの値を取り出しています。
出力結果
Master U male
Taro Yamada male
Hanako Tanaka female
出力結果はnamedtuple
を使わない場合と同じになりますが、取り出したデータがnamedtuple
に入っているので、さらにそれらの値を加工して活用することができます。
まとめ
結果だけを考えると、namedtuple
を使って、わざわざややこしいやり方をする必要がないんじゃないかと思えてきますが、あくまでこのように使うという例を挙げているだけです。
なので、学習した先にあるもっと便利な使い方があるので、やっぱり実践に入らないとその便利さは感じられないかもしれません。
毎日ちょっとでも積み重ねていくことが重要なので、少しずつ自分のものにしていきましょう。
ということで、明日もGood Python!