【jinja2】テンプレートエンジンでデータの連続差し込み
テンプレートの文章や書類にデータを差し込んでいくなら、テンプレートエンジンを使うのが楽だ。一年前に投稿していたが、すっかり存在を忘れていた。前回のついでに復習します。
作業環境
前準備
下記の2つは先に作っておく。
- テンプレート文章
- 差し込み用データ
テンプレート文章
"こんにちは、{{ name }}様。\nご注文の{{ item }}を{{ quantity }}つお持ちしました。"
差し込み用データ
マジックコマンドで読み込む。
%cat data.csv
コリンズ,アンプ,1
ウルフ,弦,5
ホプキンス,バーボン,3
レモン,ライム,6
フッカー,拳銃,1
ウォーターズ,マイク,2
ガイ,帽子,1
CSVデータの読み込み
Pandasでデータの入ったCSVファイルを読み込み、DataFrameにします。
import pandas as pd # csv to json df = pd.read_csv("data.csv", encoding='utf-8', names=("name","item","quantity") ) df
name | item | quantity | |
---|---|---|---|
0 | コリンズ | アンプ | 1 |
1 | ウルフ | 弦 | 5 |
2 | ホプキンス | バーボン | 3 |
3 | レモン | ライム | 6 |
4 | フッカー | 拳銃 | 1 |
5 | ウォーターズ | マイク | 2 |
6 | ガイ | 帽子 | 1 |
PandasDataFrameをjsonファイルで保存
TwitterなどのAPIのデータはjson形式になっている。データベースの仕様の関係だろうけど、慣れる為にも敢えてCSVをjsonに変換します。
# jsonで保存 df.to_json("data.json")
テンプレートエンジンの使い方 基本編
簡単な例。
# 差し込み from jinja2 import Template # テンプレート文章 tpl_text = "こんにちは、{{ name }}様。\nご注文の{{ item }}を{{ quantity }}つお持ちしました。" # データ(辞書型) data = {"name":"Jimi", "item":"Guitar","quantity":"2"} # レンダリング temp = Template(tpl_text) disp_text = temp.render(data) # 表示 print(disp_text)
こんにちは、Jimi様。
ご注文のGuitarを2つお持ちしました。
用意しておいたテンプレート文章中の二重波カッコ変数に、辞書型データが挿入された。
紋切り型文章の大量生産ができそうだ。
変数はデータのキーと対応している。
jsonファイルからテンプレートに次々と 応用編
テンプレートエンジンの基本的な使い方を押さえたところで、ここからはjsonファイルのデータを次々とテンプレートにはめ込んでいく。
Pandasでjsonファイル読み込み
df_js = pd.read_json("data.json")
df_js
name | item | quantity | |
---|---|---|---|
0 | コリンズ | アンプ | 1 |
1 | ウルフ | 弦 | 5 |
2 | ホプキンス | バーボン | 3 |
3 | レモン | ライム | 6 |
4 | フッカー | 拳銃 | 1 |
5 | ウォーターズ | マイク | 2 |
6 | ガイ | 帽子 | 1 |
上のほうでCSVを読み込んだときのと同じ表示になっている。
テンプレート文章
先に用意しておく。
# テンプレート文章 tpl_text = "こんにちは、{{ name }}様。\nご注文の{{ item }}を{{ quantity }}つお持ちしました。"
嵌め込み
テンプレート文章にデータを次々と嵌め込んでいく。
temp = Template(tpl_text) for i in range(len(df_js)): data = df_js.iloc[i] disp_text = temp.render(data) print(disp_text) print("="*20)
こんにちは、コリンズ様。
ご注文のアンプを1つお持ちしました。
====================
こんにちは、ウルフ様。
ご注文の弦を5つお持ちしました。
====================
こんにちは、ホプキンス様。
ご注文のバーボンを3つお持ちしました。
====================
こんにちは、レモン様。
ご注文のライムを6つお持ちしました。
====================
こんにちは、フッカー様。
ご注文の拳銃を1つお持ちしました。
====================
こんにちは、ウォーターズ様。
ご注文のマイクを2つお持ちしました。
====================
こんにちは、ガイ様。
ご注文の帽子を1つお持ちしました。
====================
SNSのタイムラインのようだ。
テンプレートを文章の換わりにhtmlファイルにして、データを次々に差し込めば…