Souvent, je me retrouve à devoir effectuer des tâches telles que générer des rapports, sortir des fichiers ou des chaînes. Ils suivent tous plus ou moins un modèle, et souvent les modèles sont si similaires que nous souhaitons disposer d'un modèle dans lequel nous pouvons réutiliser et alimenter directement les données. Heureusement, Python propose une classe qui peut nous aider : string.Template.
Dans cet article, vous apprendrez comment exploiter cette classe pour générer un fichier de sortie basé sur les données que vous utilisez actuellement, et comment manipuler les chaînes de la même manière. Ainsi, au lieu de simplement utiliser des exemples que vous pourriez rencontrer dans votre travail quotidien, cet article vous présente un certain nombre d'outils réels que vous connaissez probablement et qui utilisent cette classe pour générer des fichiers de rapport. Commençons !
Remarque : cet article est basé sur Python 3.9.0 (CPython). Vous pouvez trouver des exemples de code utilisés tout au long de cet article sur GitHub (https://github.com/DahlitzFlorian/generate-file-reports-using-pythons-template-class).
Avant de regarder un exemple, prenons le temps d'examiner les avantages de l'utilisation de string.Template par rapport à d'autres solutions.
1. Aucune autre dépendance n'est requise, cela fonctionne immédiatement, il n'est donc pas nécessaire d'utiliser la commande pip install pour l'installer.
2. Il est léger et, bien sûr, les moteurs de modèles tels que Jinja2 et Mako ont été largement utilisés. Cependant, dans le scénario présenté dans cet article, ces capacités sont surestimées.
3. Séparation des préoccupations : au lieu d'intégrer la manipulation de chaînes et la génération de rapports directement dans le code, vous pouvez utiliser des fichiers modèles pour les déplacer vers un emplacement externe. Si vous souhaitez modifier la structure ou la conception de votre rapport, vous pouvez échanger des fichiers modèles sans modifier votre code.
En raison de ces avantages, certaines bibliothèques et outils tiers bien connus l'utilisent. Wily en est un exemple, et fin 2018, Anthony Shaw, l'inventeur et responsable de Wily, souhaitait prendre en charge HTML comme format de sortie pour les rapports générés par Wily.
Exemple : Générer un rapport des meilleurs livres
Après avoir discuté de la motivation derrière l'utilisation de la classe string.Template intégrée à Python, nous examinerons le premier exemple pratique. Imaginez que vous travaillez pour une entreprise qui publie un rapport annuel sur les meilleurs livres publiés au cours de l'année écoulée. 2020 est une année particulière car en plus de votre rapport annuel, vous publiez également une liste des meilleurs livres jamais écrits.
À ce stade, peu nous importe d'où proviennent les données ou quels livres font partie de la liste. Pour plus de simplicité, supposons que nous disposions d'un fichier JSON appelé data.json qui contient un mappage des noms d'auteurs et des titres de livres, comme indiqué ci-dessous.
{ "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" }
Votre tâche est maintenant de le partager d'une certaine manière avec d'autres (par exemple de grands magazines, des entreprises ou des blogueurs). L'entreprise a décidé qu'un simple tableau au format HTML suffirait. Maintenant la question est : comment générer ce tableau HTML ?
Bien sûr, vous pouvez le faire manuellement ou créer des espaces réservés pour chaque livre. Mais il serait très souhaitable de disposer ultérieurement d'une version plus générale, car le contenu de la liste peut être étendu ou la conception structurelle modifiée.
Nous pouvons désormais profiter de la classe string.Template de Python ! Nous commençons par créer le modèle réel comme indiqué ci-dessous. Ici, nous appelons le fichier 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>
Le document lui-même est très rudimentaire. Nous avons utilisé bootstrap pour styliser et créer la structure de base de la table finale. L'en-tête est inclus, mais les données sont toujours manquantes. Notez que dans l'élément tbody, un espace réservé ${elements} est utilisé pour marquer l'endroit où nous injecterons ultérieurement la liste des livres.
Nous nous sommes tous mis en place pour implémenter un script Python qui génère le résultat souhaité ! Par conséquent, nous créons un nouveau fichier Python nommé report.py dans le répertoire de travail actuel. Tout d'abord, nous importons les deux modules intégrés requis et chargeons les données à partir d'un fichier JSON.
# report.py import json import string with open("data.json") as f: data = json.loads(f.read())
Maintenant, la variable data est un dictionnaire contenant le nom de l'auteur (clé) et le titre du livre (valeur) sous forme de paires clé-valeur. Ensuite, nous générons le tableau HTML et le plaçons dans le modèle (vous vous souvenez des espaces réservés ?). Nous initialisons donc une chaîne vide et y ajoutons de nouvelles lignes de tableau comme indiqué ci-dessous.
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>"
Cet extrait de code nous montre parcourir tous les éléments du dictionnaire de données et placer le titre du livre ainsi que le nom de l'auteur dans les balises HTML correspondantes. Nous avons créé le tableau HTML final. À l'étape suivante, nous devons charger le fichier modèle que nous avons créé précédemment :
with open("template.html") as t: template = string.Template(t.read())
Notez que string.Template accepte une chaîne, pas un chemin de fichier. Par conséquent, vous pouvez également fournir une chaîne préalablement créée dans le programme sans la sauvegarder dans un fichier. Dans notre cas, nous fournissons le contenu du fichier template.html.
Enfin, nous utilisons la méthode replace() du modèle pour remplacer l'élément placeholder par la chaîne stockée dans le contenu de la variable. La méthode renvoie une chaîne que nous stockons dans la variable final_output. Enfin, nous créons un nouveau fichier appelé report.html et y écrivons le résultat final.
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()方法以及在哪种情况下使用它可能会有所帮助。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!