Zautomatyzujmy powtarzalne zadania, na które nie powinniśmy niepotrzebnie tracić czasu.
Python-docx
Wszyscy mamy czasem poczucie, że spędziliśmy zbyt dużą część dnia na wykonywaniu wielu powtarzalnych i żmudnych czynności. Na przykład zajmując się data science masz potrzebę generowania okresowych raportów, co zapewne robisz ręcznie a co mogłoby być wykonywanie automatycznie. Nie wątpimy, że Twój czas jest znacznie cenniejszy niż zajmowanie się nieznośnym zadaniem polegającym na wypełnianiu tabel, pisaniu nagłówków, podtytułów i liczb. Wszystko byłoby lepsze od otwierania Worda po raz kolejny, mógłbyś na przykład podrasować z nami swój kod.
Na szczęście jest pakiet, który może zaradzić naszym kłopotom. Jeśli jeszcze nie przejrzałeś dokumentacji python-docx, zdecydowanie radzimy Ci to zrobić. Jest to chyba jeden z najbardziej intuicyjnych i łatwych do zrozumienia interfejsów API, z którymi można pracować. Pozwala zautomatyzować generowanie dokumentów poprzez wstawianie tekstu, wypełnianie tabel i renderowanie obrazów do raportu na żądanie. Bez zbędnych ceregieli - przejdźmy dalej i wygenerujmy własny automatyczny raport!
Generujemy templatkę
Zanim będziesz mógł kontynuować, musisz najpierw utworzyć swój własny dokument szablonu, który jest w zasadzie zwykłym dokumentem Microsoft Word (.docx). Szablon będzie stworzony dokładnie tak, jak chcesz, aby wyglądał Twój automatyczny raport. Musimy tu więc określić wszystkie szczegóły, takie jak kroje pisma, rozmiary czcionek, formatowanie i struktura strony. Jedyne, co musisz zrobić, to utworzyć symbole zastępcze w miejscach gdzie mają się pojawiać automatycznie wstawiane zawartości i zadeklarować je z unikalnymi zmiennymi. Na przykład:
{{title}}
{{day}} / {{month}} / {{year}}
{%tr for item in table_contents %}
Jak zapewne od razu się domyślasz, każdą zautomatyzowaną treść można zadeklarować w zestawie podwójnych nawiasów klamrowych {{nazwa_zmiennej}}
. Obejmuje to tak tekst jak i obrazy. W przypadku tabel jest to trochę bardziej skomplikowane. Musisz utworzyć tabelę z wierszem szablonu zawierającym wszystkie kolumny, a następnie musisz dołączyć jeden wiersz powyżej i jeden poniżej z następującą notacją:
Pierwszy wiersz: {%tr for item in variable_name %}
Ostatni wiersz: {%tr endfor %}
Po zakończeniu zapisz dokument w swoim katalogu jako plik .docx i kontynuuj pisanie kodu, aby wywołać szablon i wygenerować zautomatyzowany dokument.
Instalujemy python-docx
Po utworzeniu szablonu uruchom Anacondę lub dowolne wybrane środowisko Python IDE i zainstaluj następujące pakiety:
pip install docx
pip install docxtpl
Zaimportuj następujące pakiety:
from docx.shared import Cm
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Cm, Inches, Mm, Emu
import random
import datetime
import matplotlib.pyplot as plt
Sprawdź oferty pracy na TeamQuest
Działamy na szablonie
Zaimportuj utworzony szablon i utwórz instancję zmiennych:
#Import template document
template = DocxTemplate('automated_report_template.docx')
#Generate list of random values
table_contents = []
x = []
y = []
for i in range(0,12):
number = round(random.random(),3)
table_contents.append({
'Index': i,
'Value': number
})
x.append(i)
y.append(number)
#Plot random values and save figure
fig = plt.figure()
plt.plot(x, y)
fig.savefig('image.png', dpi=fig.dpi)
#Import saved figure
image = InlineImage(template,'image.png',Cm(10))
Na koniec zadeklaruj swoje zmienne w słowniku i użyj go do renderowania zautomatyzowanego dokumentu tekstowego:
#Declare template variables
context = {
'title': 'Automated Report',
'day': datetime.datetime.now().strftime('%d'),
'month': datetime.datetime.now().strftime('%b'),
'year': datetime.datetime.now().strftime('%Y'),
'table_contents': table_contents,
'image': image
}
#Render automated report
template.render(context)
template.save('generated_report.docx')
Właśnie otrzymałeś pierwszy automatycznie wygenerowany raport. Możesz oczywiście wygenerować dowolną liczbę wierszy i kolumn w tabeli, a także renderować dowolną liczbę stron w dokumencie.