Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Модули за низове и време
Низов модул
Цел
Съберете данните от заявките и изпратете отговорни писма, използвайки модула string.
Сега, когато материалите за новото строителство на фермата са събрани, е време да обърнем внимание на новия персонал за фермата. Имаме няколко писма, които трябва да бъдат изпратени за кандидатстване за работа, като естествено това би изисквало много писане, но можем да използваме модула string, за да компенсираме това, позволявайки ни да създаваме шаблони и да форматираме текст, за да направим работата с текстови блокове по-лесна.
Импортирането на модула string този път ще се осъществи малко по-различно от другите модули, тъй като ще импортираме класове, които разширяват модула, и те ще бъдат изпълнени по следния начин:
import string from string import Template from string import Formatter
Това ни дава достъп както до самия модул, така и до шаблонните и форматиращите класове, които включват свои собствени функции. За нашите цели ще използваме следните функции и класове:
string.capwords(): Тази функция конвертира думите в низ така, че да имат правилна капитализация, като първата буква на думата става главна, а останалите стават малки букви, независимо от това как е форматиран низа.Template(): Това е клас за низове, който се използва за създаване на шаблонен обект. Той използва функциятаsubstitute(), която позволява да зададете низ и да маркирате място, използвайки знака$за заместване на данните. Това ви позволява да създавате модулни низове, които можете да използвате по ваше усмотрение.Formatter(): Това е клас за низове, който се използва за форматиране или съставяне на низ. Работи по подобен начин на класаTemplate(), но е по-универсален и подходящ за по-големи низови последователности. Използва функциятаformat(), която позволява да зададете низ и да вмъкнете данни в него, използвайки{}.
Започнете, като отидете при светлия X знак и използвате функцията read(), докато сте обърнати към шкафчето за файлове. Това ще ви позволи да получите достъп до папки с името на различни кандидати. Тези папки са представени като три (3) списъчни константи с имена: folder_a, folder_b и folder_c.
Отидете при тъмния X знак върху зеления килим и обърнете се към бюрото. Създайте три (3) списъка, наречени: names_a, names_b и names_c. Използвайте списъчни разбирания (list comprehensions) с функцията string.capwords() за правилно форматиране на капитализацията на имената. Съчетайте списъците с константите, които използват същите букви в името си, например за names_a използвайте string.capwords() с folder_a, както следва: names_a = [string.capwords(x) for x in folder_a]. Използвайте тази същата формула, за да попълните names_b и names_c.
Създайте списък, наречен all_names, и съберете трите (3) списъка с имена, както следва: all_names = names_a + names_b + names_c. Това ще комбинира всички списъци в един по-голям списък. След това използвайте Python функцията join(), която ще съедини всички елементи от списъка в един низ. Можете също така да зададете какво да се постави между всеки елемент от списъка, като го обявите в кавички, както следва: all_names = ", ".join(all_templates). Използвайте предварително написаната функция write() с списъка all_names, за да запишете всички имена с правилната им капитализация.
След това, отидете до златния X знак и обърнете се към бюрото, където ще създадем шаблони. Тук ще разполагаме с два предварително написани шаблонни обекта, наречени red_templates и blue_templates:
red_template = Template( "Hello, $name , thank you for applying for this position.") blue_template = Template( "Esteemed , $name , your application has been approved.")
Всеки от тези шаблони съдържа уникално съобщение, но имат едно общо нещо – плейсхолдър, означен като $name. Символът $ се използва, за да маркира плейсхолдър, който може да бъде заменен с низ по ваш избор, в този случай както заглавието подсказва – с име. Ако не се замени стойност, шаблонът просто ще използва самия плейсхолдър в низа. За да допълните това, създайте списък, наречен all_templates.
Създайте for цикъл с четири (4) итерации, с който ще заменим имената в трите (3) списъка с имена със шаблони, съдържащи имената. Например, ще приложим red_template към списъка names_a. Използвайте функцията substitute() от класа Template(), за да замените плейсхолдъра $name в шаблона с имената от списъка.
for x in range(4): names_a[x] = red_template.substitute(name=names_a[x])
Направете същото с names_b и names_c: за names_b използвайте също red_template, а за names_c използвайте blue_template.
След като всички списъци с имена са попълнени с новите шаблони, е време да ги прегледаме. Създайте нов списък, наречен all_templates, и добавете всички списъци с имена заедно, както следва: all_templates = names_a + names_b + names_c. Използвайте същата функция join(), както по-рано, за да обедините всички имена със шаблони в четим вид, както следва: all_templates = "\n".join(all_templates). Използвайте предварително написаната функция write() с all_templates, за да запишете всички заглавия за различните имена.
След това отидете до тъмния X знак върху червения килим и обърнете се към бюрото, където ще форматираме и запишем първия комплект писма. Започнете, като създадете два (2) форматиращи обекта, наречени red_1 и red_2, с указване на класа, както следва: red_1 = Formatter(), red_2 = Formatter(). За съставянето на писмата създайте списък, наречен red_letters.
Подобно на предишните стъпки, ще използваме for цикъл с четири (4) итерации. Ще имаме два комплекта предварително написани низове, които ще бъдат форматирани с помощта на функцията format() и към тях ще бъдат добавени променливи за имената. Тези форматирани низове ще бъдат добавяни към списъка red_letters, формирайки комплексен списък с писма, които ще бъдат изпратени. Например, обектът за форматиране red_1 ще бъде форматиран със списъка names_a и добавен към списъка red_letters.
for x in range(4): red_letters.append(red_1.format( "{} Orientation will begin next week, please report to the office..." , names_a[x]))
Направете същото с обекта за форматиране red_2, използвайки неговия предварително написан низ и добавете names_b в цикъла. След като всичко е настроено, използвайте функцията join() със списъка red_letters, за да обедините данните в един файл, както следва: red_letters = "\n".join(red_letters). Използвайте функцията write() с red_letters, за да запишете всички форматирани писма, които ще бъдат изпратени.
Накрая, отидете до тъмния X знак върху синия килим и обърнете се към бюрото, където ще форматираме и съставим последния комплект писма. Подобно на предишните стъпки, създайте два (2) форматиращи обекта, наречени blue_1 и blue_2, с указване на класа, както следва: blue_1 = Formatter(), blue_2 = Formatter(). Създайте списък blue_letters за форматиране и съставяне на писмата.
Още веднъж, създайте for цикъл с четири (4) итерации и използвайте предварително написаните низове, за да форматирате списъците с имена и да ги добавите към списъка blue_letters с помощта на функцията format(). В този случай, съчетайте обектите за форматиране blue_1 със списъка names_c и blue_2 със списъка names_b. Всичко това се извършва по същия начин, както при червения килим, но с използване на различни стойности, което показва гъвкавостта при използване на формати и шаблони. След като приключите, използвайте функцията write() с blue_letters, за да запишете последните писма и да завършите нивото.