よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【jinja2】テンプレートエンジンでデータの連続差し込み

テンプレートの文章や書類にデータを差し込んでいくなら、テンプレートエンジンを使うのが楽だ。一年前に投稿していたが、すっかり存在を忘れていた。前回のついでに復習します。



作業環境


  • Androidスマホ
  • Python3.8
  • Jupyter Notebook
  • 外部ライブラリ
    • Pandas(CSVjsonの読み書き)
    • 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形式になっている。データベースの仕様の関係だろうけど、慣れる為にも敢えてCSVjsonに変換します。

# 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ファイルにして、データを次々に差し込めば…