レポート、出力ファイル、または文字列を生成するタスクを実行する必要があることがよくあります。それらはすべて多かれ少なかれパターンに従いますが、多くの場合、パターンが非常に似ているため、再利用してデータを直接フィードできるテンプレートが必要になります。幸いなことに、Python には、string.Template という役立つクラスが用意されています。
この記事では、このクラスを使用して、現在作業しているデータに基づいて出力ファイルを生成する方法と、同じ方法で文字列を操作する方法を学習します。したがって、この記事では、日常業務で遭遇する可能性のある例を単に使用するのではなく、このクラスを使用してレポート ファイルを生成する、おそらくご存知の実際のツールを多数紹介します。始めましょう!
注: この記事は Python 3.9.0 (CPython) に基づいています。この記事全体で使用されているコード例は、GitHub (https://github.com/DahlitzFlorian/generate-file-reports-using-pythons-template-class) で見つけることができます。
例を見る前に、他のソリューションと比べて string.Template を使用する利点を見てみましょう。
1. 他の依存関係は必要なく、そのまま使用できるため、インストールするために pip install コマンドを使用する必要はありません。
2. 軽量なのはもちろん、Jinja2やMakoなどのテンプレートエンジンも広く使われています。ただし、この記事で説明するシナリオでは、これらの機能は誇張されています。
3. 関心事の分離: 文字列操作とレポート生成をコードに直接埋め込む代わりに、テンプレート ファイルを使用して外部の場所に移動できます。レポートの構造やデザインを変更したい場合は、コードを変更せずにテンプレート ファイルを交換できます。
これらの利点により、いくつかのよく知られたサードパーティのライブラリやツールがこれを使用しています。 Wily はその一例であり、2018 年後半、Wily の発明者および管理者である Anthony Shaw は、Wily によって生成されるレポートの出力形式として HTML をサポートしたいと考えました。
例: 最高の書籍のレポートの生成
Python の組み込み string.Template クラスを使用する動機について説明した後、次のことを見ていきます。実際の例。あなたが、過去 1 年間に出版された最も優れた書籍に関する年次報告書を発行する会社で働いていると想像してください。 2020 年は特別な年です。年次報告書に加えて、史上最高の書籍のリストも発表されています。
この時点では、データの出所や、どの書籍がリストに含まれているかは気にしません。わかりやすくするために、次に示すように、著者名と本のタイトルのマッピングを含む data.json という JSON ファイルがあると仮定します。
{ "Dale Carnegie": "How To Win Friends And Influence People", "Daniel Kahneman": "Thinking, Fast and Slow", "Leo Tolstoy": "Anna Karenina", "William Shakespeare": "Hamlet", "Franz Kafka": "The Trial" }
あなたの仕事は、他の人 (大手雑誌、企業、ブロガーなど) と共有できる方法でそれを共有することです。同社は、HTML 形式の単純なテーブルで十分であると判断しました。ここで問題は、この HTML テーブルをどのように生成するかということです。
もちろん、これを手動で行うことも、書籍ごとにプレースホルダーを作成することもできます。ただし、リストの内容を拡張したり、構造設計を変更したりできるため、後でより一般的なバージョンを作成することが非常に望ましいでしょう。
これで、Python の string.Template クラスを活用できるようになりました。以下に示すように、実際のテンプレートを作成することから始めます。ここでは、ファイルを template.html と呼びます。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Great Books of All Time</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous"> </head> <body> <h1>Great Books of All Time</h1> <table > <thead> <tr> <th scope="col">#</th> <th scope="col">Author</th> <th scope="col">Book Title</th> </tr> </thead> <tbody> ${elements} </tbody> </table> </body> </html>
このドキュメント自体は非常に初歩的なものです。最終テーブルのスタイリングと基本構造の作成にはブートストラップを使用しました。ヘッダーは含まれていますが、データがまだありません。 tbody 要素内では、プレースホルダー ${elements} が、後で書籍のリストを挿入する場所をマークするために使用されていることに注意してください。
必要な出力を生成するように設定されたすべての Python スクリプトを配置します。したがって、現在の作業ディレクトリに report.py という名前の新しい Python ファイルを作成します。まず、必要な 2 つの組み込みモジュールをインポートし、JSON ファイルからデータを読み込みます。
# report.py import json import string with open("data.json") as f: data = json.loads(f.read())
さて、データ変数は、著者の名前 (キー) と本のタイトル (値) をキーと値のペアとして含む辞書です。次に、HTML テーブルを生成し、それをテンプレートに組み込みます (プレースホルダーを覚えていますか?)。したがって、以下に示すように、空の文字列を初期化し、それに新しいテーブル行を追加します。
content = "" for i, (author, title) in enumerate(data.items()): content += "<tr>" content += f"<td>{i + 1}</td>" content += f"<td>{author}</td>" content += f"<td>{title}</td>" content += "</tr>"
このコード スニペットは、データ ディクショナリ内のすべての項目をループし、書籍のタイトルと著者の名前を対応する HTML タグに配置することを示しています。最終的な HTML テーブルを作成しました。次のステップでは、前に作成したテンプレート ファイルをロードする必要があります。
with open("template.html") as t: template = string.Template(t.read())
string.Template はファイル パスではなく文字列を受け入れることに注意してください。したがって、プログラム内で以前に作成した文字列を、ファイルに保存せずに指定することもできます。この例では、template.html ファイルのコンテンツを提供します。
最後に、テンプレートの replace() メソッドを使用して、プレースホルダー要素を変数コンテンツに格納されている文字列に置き換えます。このメソッドは文字列を返し、それを変数final_outputに保存します。最後になりましたが、report.html という新しいファイルを作成し、そのファイルに最終出力を書き込みます。
final_output = template.substitute(elements=content) with open("report.html", "w") as output: output.write(final_output)
现在已经生成了第一个文件报告!如果在浏览器中打开report.html文件,则可以看到结果。
safe_substitution()方法
现在,您已经构建了第一个string.Template用例,在结束本文之前,我想与您分享一个常见情况及其解决方案:安全替换。它是什么?
让我们举个例子:您有一个字符串,您想在其中输入一个人的名字和姓氏。您可以按照以下步骤进行操作:
# safe_substitution.py import string template_string = "Your name is ${firstname} ${lastname}" t = string.Template(template_string) result = t.substitute(firstname="Florian", lastname="Dahlitz") print(result)
但是,如果您错过传递一个或另一个的值会怎样?它引发一个KeyError。为避免这种情况,我们可以利用safe_substitution()方法。在这种情况下,safe意味着Python在任何情况下都尝试返回有效字符串。因此,如果找不到任何值,则不会替换占位符。
让我们按以下方式调整代码:
# safe_substitution.py import string template_string = "Your name is ${firstname} ${lastname}" t = string.Template(template_string) result = t.safe_substitute(firstname="Florian") print(result)# Your name is Florian ${lastname}
在某些情况下,这可能是一个更优雅的解决方案,甚至是必须的行为。但是这可能在其他地方引起意外的副作用。
在阅读本文时,您不仅学习了Python字符串的基本知识。Template类以及使用它的原因,而且还实现了第一个文件报告脚本!此外,您已经了解了safe_substitution()方法以及在哪种情况下使用它可能会有所帮助。
以上がPython の Template クラスを使用してファイル レポートを生成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。