Banyak kali, saya mendapati diri saya perlu melaksanakan tugas yang menjana laporan, fail output atau rentetan. Kesemuanya lebih kurang mengikut corak, dan selalunya coraknya sangat serupa sehingga kami ingin mempunyai templat yang boleh kami gunakan semula dan suapan data terus ke dalamnya. Nasib baik, Python menyediakan kelas yang boleh membantu kami: string.Template.
Dalam artikel ini, anda akan belajar cara menggunakan kelas ini untuk menjana fail output berdasarkan data yang anda sedang gunakan dan cara memanipulasi rentetan dengan cara yang sama. Jadi daripada hanya menggunakan contoh yang mungkin anda hadapi dalam kerja seharian anda, artikel ini memberi anda beberapa alatan sebenar yang mungkin anda ketahui yang menggunakan kelas ini untuk menjana fail laporan. Mari mulakan!
Nota: Artikel ini adalah berdasarkan Python 3.9.0 (CPython). Anda boleh menemui contoh kod yang digunakan sepanjang artikel ini di GitHub (https://github.com/DahlitzFlorian/generate-file-reports-using-pythons-template-class).
Sebelum melihat contoh, mari luangkan sedikit masa untuk melihat kelebihan menggunakan rentetan.Templat berbanding penyelesaian lain.
1. Tiada kebergantungan lain diperlukan dan ia berfungsi di luar kotak, jadi tidak perlu menggunakan arahan pemasangan pip untuk memasangnya.
2. Ia ringan, dan sudah tentu enjin templat seperti Jinja2 dan Mako telah digunakan secara meluas. Walau bagaimanapun, dalam senario yang dibentangkan dalam artikel ini, keupayaan ini dilebih-lebihkan.
3. Pengasingan kebimbangan: Daripada membenamkan manipulasi rentetan dan penjanaan laporan terus dalam kod, anda boleh menggunakan fail templat untuk mengalihkannya ke lokasi luaran. Jika anda ingin menukar struktur atau reka bentuk laporan anda, anda boleh menukar fail templat tanpa menukar kod anda.
Disebabkan kelebihan ini, beberapa perpustakaan dan alatan pihak ketiga yang terkenal menggunakannya. Wily ialah contoh, dan pada akhir 2018, Anthony Shaw, pencipta dan penyelenggara Wily, mahu menyokong HTML sebagai format output untuk laporan yang dijana oleh wily.
Contoh: Menjana laporan buku terbaik
Selepas membincangkan motivasi di sebalik penggunaan rentetan terbina dalam Python.Kelas templat, kita akan melihat pada contoh praktikal. Bayangkan anda bekerja untuk sebuah syarikat yang menerbitkan laporan tahunan tentang buku terbaik yang diterbitkan pada tahun lalu. 2020 adalah tahun yang istimewa kerana sebagai tambahan kepada laporan tahunan anda, anda juga menerbitkan senarai buku terbaik yang pernah ditulis.
Pada ketika ini, kami tidak kisah dari mana data itu datang atau buku mana yang menjadi sebahagian daripada senarai. Untuk kesederhanaan, mari kita anggap kita mempunyai fail JSON yang dipanggil data.json yang mengandungi pemetaan nama pengarang dan tajuk buku seperti yang ditunjukkan di bawah.
{ "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" }
Tugas anda sekarang ialah berkongsinya dengan orang lain (contohnya, majalah besar, syarikat atau blogger). Syarikat memutuskan bahawa jadual ringkas dalam format HTML sudah memadai. Sekarang persoalannya ialah: bagaimana untuk menjana jadual HTML ini?
Sudah tentu, anda boleh melakukan ini secara manual atau membuat ruang letak untuk setiap buku. Tetapi adalah sangat wajar untuk mempunyai versi yang lebih umum kemudian, kerana kandungan senarai boleh dilanjutkan atau reka bentuk struktur diubah.
Kini kita boleh memanfaatkan rentetan Python.Kelas templat! Kita mulakan dengan mencipta templat sebenar seperti yang ditunjukkan di bawah. Di sini kami memanggil fail 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>
Dokumen itu sendiri sangat asas. Kami menggunakan bootstrap untuk menggayakan dan mencipta struktur asas jadual akhir. Pengepala jadual disertakan, tetapi data masih tiada. Perhatikan bahawa dalam elemen tbody, pemegang tempat ${elements} digunakan untuk menandakan tempat kami akan menyuntik senarai buku kemudiannya.
Kami semua telah menyediakan untuk melaksanakan skrip Python yang menjana output yang diingini! Oleh itu, kami mencipta fail Python baharu yang dipanggil report.py dalam direktori kerja semasa. Pertama, kami mengimport dua modul terbina dalam yang diperlukan dan memuatkan data daripada fail JSON.
# report.py import json import string with open("data.json") as f: data = json.loads(f.read())
Kini, pembolehubah data ialah kamus yang mengandungi nama pengarang (kunci) dan tajuk buku (nilai) sebagai pasangan nilai kunci. Seterusnya, kami menjana jadual HTML dan memasukkannya ke dalam templat (ingat ruang letak?). Jadi, kami memulakan rentetan kosong, menambah baris jadual baharu padanya seperti yang ditunjukkan di bawah.
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>"
Coretan kod ini menunjukkan kami menggelungkan semua item dalam kamus data dan meletakkan tajuk buku serta nama pengarang dalam teg HTML yang sepadan. Kami mencipta jadual HTML akhir. Dalam langkah seterusnya, kita perlu memuatkan fail templat yang kami buat sebelum ini:
with open("template.html") as t: template = string.Template(t.read())
Perhatikan bahawa rentetan.Templat menerima rentetan, bukan laluan fail. Oleh itu, anda juga boleh menyediakan rentetan yang dibuat sebelum ini dalam program tanpa menyimpannya ke fail. Dalam kes kami, kami menyediakan kandungan fail template.html.
Akhir sekali, kami menggunakan kaedah replace() templat untuk menggantikan elemen pemegang tempat dengan rentetan yang disimpan dalam kandungan berubah. Kaedah ini mengembalikan rentetan, yang kami simpan dalam pembolehubah final_output. Akhir sekali, kami mencipta fail baharu yang dipanggil report.html dan menulis output akhir pada fail tersebut.
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()方法以及在哪种情况下使用它可能会有所帮助。
Atas ialah kandungan terperinci Hasilkan laporan fail menggunakan kelas Templat Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!