>  기사  >  백엔드 개발  >  Python의 템플릿 클래스를 사용하여 파일 보고서 생성

Python의 템플릿 클래스를 사용하여 파일 보고서 생성

WBOY
WBOY앞으로
2023-04-13 18:13:181556검색

Python의 템플릿 클래스를 사용하여 파일 보고서 생성

소개

보고서 생성, 파일 또는 문자열 출력과 같은 작업을 수행해야 할 때가 많습니다. 그것들은 모두 어느 정도 패턴을 따르며, 종종 패턴이 너무 유사해서 재사용하고 데이터를 직접 공급할 수 있는 템플릿을 원합니다. 다행스럽게도 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 클래스를 사용하는 동기를 논의한 후 첫 번째 실제 예를 살펴보겠습니다. 당신이 작년에 출판된 최고의 책에 대한 연례 보고서를 출판하는 회사에서 일한다고 상상해 보십시오. 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 파일을 만듭니다. 먼저, 필요한 두 개의 내장 모듈을 가져오고 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 파일의 내용을 제공합니다.

마지막으로 템플릿의 replacement() 메서드를 사용하여 자리 표시자 요소를 변수 콘텐츠에 저장된 문자열로 바꿉니다. 이 메서드는 문자열을 반환하며 이를 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의 템플릿 클래스를 사용하여 파일 보고서 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제