- •Email пакеті
- •Хабарларды талдау. Message классы
- •Хабарлама қалыптастыру
- •Тақырыпша өрісін талдау
- •Атаулар кеңістігі
- •Cgi модулі
- •Өндіруші ортасы
- •Zope және оның обьектілі моделі
- •Smtplib модулі
- •Poplib модулі
- •Url талдау үшін функия
- •Urllib2 мүмкіндіктері
- •Қорытынды
- •Обьект – байланыс
- •Объект-курсор
- •Обьектер-түрлері
- •Python – қосымшаларындағы деректер қоырмен жұмыс істеу
- •Деректер қорын толтыру
- •Деректер қорынан таңдау
- •Ескерту:
- •Қорытынды
- •11 Дәріс: Көп ағынды есептеулер
- •Көп ағынды бағдарлама мысалы
- •Threading модулінің функциясы
- •Thread классы
- •Қай кезде құлыпталу қажет?
Тақырыпша өрісін талдау
Төменде келтірілген мысалда Subject өрісі email.Header.make_header() көмегімен қалыптасты. Өрісті талдау үшін басқа функция өткізуге көмектеседі: email.Header.decode_header (). Бұл функция тізім кортежін қайтарады, берілген мәтін бойынша, олардың әр қайсысында мәтін өрісінің бөлігі және кодтау көрсетілген. Келесі мысалда бұған түсініктеме келтірілген:
subj = """=?koi8-r?Q?=FC=D4=CF_=D0=D2=C9=CD=C5=D2_=CF=DE=C5=CE=D8_=C4=CC=C9?=
=?koi8-r?Q?=CE=CE=CF=C7=CF_=28164_bytes=29_=D0=CF=CC=D1_=D3_=D4?=
=?koi8-r?Q?=C5=CD=CF=CA_=D3=CF=CF=C2=DD=C5=CE=C9=D1=2E_=EF=CE=CF_?=
=?koi8-r?Q?=D2=C1=DA=C2=C9=CC=CF=D3=D8_=CE=C1_=CB=D5=D3=CB=C9_=D7?=
=?koi8-r?Q?_=D3=CF=CF=C2=DD=C5=CE=C9=C9=2C_=CE=CF_=CC=C5=C7=CB=CF?=
=?koi8-r?Q?_=D3=CF=C2=C9=D2=C1=C5=D4=D3=D1_=D7_=D4=C5=CB=D3=D4_?=
=?koi8-r?Q?=D3_=D0=CF=CD=CF=DD=D8=C0_email=2EHeader=2Edecode=5Fheader?=
=?koi8-r?Q?=28=29?="""
import email.Header
for text, enc in email.Header.decode_header(subj):
print enc, text
Нәтижесінде:
koi8-r Бұл хабарлама тақырыбымен берілген өте ұзын (164 bytes) өрістің мысалы. Ол хабарлама бөліктеріне бөлінген, бірақ email.Header.decode_header ( ) көмегімен мәтінге тез жинақталады.
Айта кететіні, көрсетпеседе болады:
>>> email.Header.decode_header("simple text")
[('simple text', None)]
>>> email.Header.decode_header("пример")
[('\xd0\xd2\xc9\xcd\xc5\xd2', None)]
>>>email.Header.decode_header("=?KOI8-R?Q?=D0=D2=CF_?=Linux")
[('\xd0\xd2\xcf ', 'koi8-r'), ('Linux', None)]
Егер бірінші жағдайда us-ascii тұспалдауға болатын болса, онда екінші жағдайда кодтау жайында аңғару керек болады: міне осыған байланысты электронды хатта жайдан жай сегіздік кодтауды қолдануға болмайды. Үшінші мысалда орысша әріптер кодталған, ал латынша – кодталмаған, сондықтан email.Header.decode_header() нәтижесінде екі жұп тізімі.
Жалпы жағдайда хабарлама өрісін тек Unicode-та ұсынуға болады. Осындай түрлендіру үшін функция құру жаттығу ретінде ұсынылады.
XML тілі
Бір дәрістің ішінде XML не екенін түсіндіру қиын және онымен қалай жұмыс істеу керек екені де. Мысалда стандартты жеткізілуіне кіретін xml пакеті қолданылады.
XML (Extensible Markup Language, Кеңейтілген Белгілеу Тілі) әр түрлі өндіруші қосымшаларының арасында өзара байланысын реттеуге, сақтауға және күрделі құрылымдық деректерді өңдеуге ұшыратуға мүмкіндік береді.
XML тілі (HTML сияқты) SGML-дің ішкі жиыны болып табылады, бірақ оның қолданылуы WWW жүйесімен шектелмеген. XML – де нақты тақырып шегі үшін өзінің тегтер жинағын құруға болады. XML – де мәліметтер қорын өңдеуді және білімді, обьекттер арасында өзара байланысты хаттамаларын, ресурстар сипаттамасын және т.б. сақтауға және таратуға болады.
Жаңа үйренушілерге әр кезде түсінікті емес: дәл сол мәліметтерді сақтау үшін өзіңнің компакті форматын құруға болатын болса, неге осындай жеткілікті көпсөзді форматты мейілінше қолдану керек. XML ерекшелігі, ол мәліметтер мен қоса контекстік ақпаратты сақтайды: тегтер және олардың атрибуттарының аттары болады. Сондай-ақ, XML бүгінде – біріңғай ортақ стандарт.
XML – құжаттары ресми-дұрыс (well-formed) және жарамды (valid) болады. Жарамды XML – құжат – бұл құжат түрін жарнамалау (DTD, Document Type Definition) тұратын ресми-дұрыс XML – құжаты. Құжат түрін жарнамалау XML-дегі мәтін құжаты қанағаттандыратын грамматика ұсынады. Баяндаманың қарапайымдылығы үшін мұнда DTD қарастырылмайды, мүмкіндігінше ресми-дұрыс құжатымен шектеледі.
Әріптер мен басқа да XML таңбаларын ұсыну үшін Unicode пайдаланады, ол әртүрлі әліпбилердің таңбаларын ұсына отырып мәселелерді қысқартады. Дегенмен бұл жағдайды есте сақтау керек және XML-де сегіздік кодтауды қолданбау керек.
Келесі XML-құжатының жеткілікті қарапайым мысалы бұл формат жайлы көрініс береді (expression.xml файлы):
<?xml version="1.0" encoding="iso-8859-1"?>
<expression>
<operation type="+">
<operand>2</operand>
<operand>
<operation type="*">
<operand>3</operand>
<operand>4</operand>
</operation>
</operand>
</operation>
</expression>
XML-құжаты әр кезде ағаш құрылымына ие, түбірінде өзі құжат. Оның бөліктері, салынған тегтер жұбымен сипатталған, тарамдар қалыптастырады. Осылайша, ағаш қабырғасы “тікелей тіркеме” білдіреді. Тег атрибуттарын жапырақтары деп санауға болады. Сонда шығатыны құжат ағаш құрылымына ие.
Ескерту:
Ескере кететіні, HTML-ден ерекшелігі, XML-де жалғыз (жұп емес) тегтер қиғаш сызықпен: <BR/>, ал атрибуттар – тырнақшаға алынып жазылады. XML-де тегтер атауындағы және атрибуттағы әріптер регистрі мәнге ие.
XML-құжатын қалыптастыру
Тұжырым бойынша XML-құжатын өңдеудің екі жолы бар: кезекті өңдеу және құжаттың обьектілік моделімен жұмыс.
Бірінші жағдайда SAX (Simple API for XML, XML үшін қарапайым бағдарламалық интерфейс) қолданылады. SAX жұмысы мәліметтер көздерін(input source) XML-анализаторларымен (XML-reader) оқу және өңдеуші-обьектілерімен (handlers) өңделетін кезекті оқиғалардың (events) буындары болып табылады. SAX XML-құжатына кезекті қолжетімділік береді.
Екінші жағдайда XML-құжатына нақты обьектілік модельді ұсына отырып, XML анализаторы DOM (Document Object Model,құжаттың обьектілік моделі) құрады. Бұл моделдің шегінде DOM-ағаш түйіні кездейсоқ қол жеткізу үшін қол жетімді, ал түйіндер арасындағы өтпе үшін әдістер реті қарастырылған.
Осы екі тәсілді жоғарыда көрсетілген XML-құжатын қалыптастыру үшін қолдануға болады.
SAX арқылы құжат былай қалыптасады:
import sys
from xml.sax.saxutils import XMLGenerator
g = XMLGenerator(sys.stdout)
g.startDocument()
g.startElement("expression", {})
g.startElement("operation", {"type": "+"})
g.startElement("operand", {})
g.characters("2")
g.endElement("operand")
g.startElement("operand", {})
g.startElement("operation", {"type": "*"})
g.startElement("operand", {})
g.characters("3")
g.endElement("operand")
g.startElement("operand", {})
g.characters("4")
g.endElement("operand")
g.endElement("operation")
g.endElement("operand")
g.endElement("operation")
g.endElement("expression")
g.endDocument(
Ағаш құрудың обьектілі моделі құжатының мысалы былай көрінуі мүмкін:
from xml.dom import minidom
dom = minidom.Document()
e1 = dom.createElement("expression")
dom.appendChild(e1)
p1 = dom.createElement("operation")
p1.setAttribute('type', '+')
x1 = dom.createElement("operand")
x1.appendChild(dom.createTextNode("2"))
p1.appendChild(x1)
e1.appendChild(p1)
p2 = dom.createElement("operation")
p2.setAttribute('type', '*')
x2 = dom.createElement("operand")
x2.appendChild(dom.createTextNode("3"))
p2.appendChild(x2)
x3 = dom.createElement("operand")
x3.appendChild(dom.createTextNode("4"))
p2.appendChild(x3)
x4 = dom.createElement("operand")
x4.appendChild(p2)
p1.appendChild(x4)
print dom.toprettyxml()
Тегтер генерациясында және басқа бөліктерінде SAX командасын қолдану кезекті түрде берілетінін аңғару оңай, ал бірдей DOM-дарды ағындарды қалыптастыру командарының түрлі кезектестігі және оның басқа ағындармен байланысы арқылы құруға болады.
Әрине, көрсетілген мысалдар теориялық сипатқа ие, өйткені іс жүзінде XML-құжаттарын осылайша құру әдетте келмейді.
XML-құжатты талдау
Дайын XML-құжатымен жұмыс істеу үшін XML-анализаторын қолдану қажет. Document класс обьектісінің құрылуымен XML-құжаты parse ( ) функциясы көмегімен тек бір жолда кездеседі. Ескере кететіні, стандартты xml пакетінен басқа PyXML пакетін немесе баламалы коммерциялық пакетті қоюға болады. Дегенмен құрастырушылар DOM Level 2 стандартымен шыққан, бірегей API ұстануға тырысады.
import xml.dom.minidom
dom = xml.dom.minidom.parse("expression.xml")
dom.normalize()
def output_tree(node, level=0):
if node.nodeType == node.TEXT_NODE:
if node.nodeValue.strip():
print ". "*level, node.nodeValue.strip()
else: # ELEMENT_NODE или DOCUMENT_NODE
atts = node.attributes or {}
att_string = ", ".join(
["%s=%s " % (k, v) for k, v in atts.items()])
print ". "*level, node.nodeName, att_string
for child in node.childNodes:
output_tree(child, level+1)
output_tree(dom)
Бұл мысалда ағаш, ағын кірісінде қабылдайтын және барлық енген ағындар үшін рекурсивті шақырылатын, нақты output_tree() функциясы көмегімен шығарылады.
Нәтижесі шамамен келесідей шығады:
#document
. expression
. . operation type=+
. . . operand
. . . . 2
. . . operand
. . . . operation type=*
. . . . . operand
. . . . . . 3
. . . . . operand
. . . . . . 4
Барлық мәтіндік фрагменттер біріктірілуі үшін, мұнда normalize() әдісі қолданылады (әйтпесе қатарынан мәтінмен берілген бірнеше түйіндерді әкелуі мүмкін).
Тіпті шағын мысалдарда ағындар атрибуттарын қолданғанын байқауға болады: node.nodeType ағын түрін көрсетеді, node.nodeValue мәліметтерге қолжетімділік үшін қолданылады, node.nodeName ағын атын береді (тег атымен сәйкес), node.attributes ағын атрибуттарына қолжетімділік береді. node.childNodes еншілес (дочерним узлам) ағындарға қолжетімділік үшін қолданылады. Осы қасиеттер ағашты рекурсивті айналып өту үшін жеткілікті.
Барлық ағындар Node классының ішкі класстарының данасы болып табылады. Олар келесідей түрде болуы мүмкін:
Атауы |
Мағынасы |
Әдіс құру үшін |
ELEMENT_NODE |
Элемент |
createElement(tagname) |
createElement(tagname) |
Атрибут |
createAttribute(name) |
TEXT_NODE |
Мәтіндік ағын |
createTextNode(data) |
CDATA_SECTION_NODE |
CDATA бөлімі |
|
ENTITY_REFERENCE_NODE |
Сілтеме мәні |
|
ENTITY_NODE |
мәні |
|
PROCESSING_INSTRUCTION_NODE |
Нұсқаулық бойынша өңдеу |
createProcessingInstruction(target, data) |
COMMENT_NODE |
Пікір |
createComment(comment) |
DOCUMENT_NODE |
Құжат |
|
DOCUMENT_TYPE_NODE |
Құжат түрі |
|
DOCUMENT_FRAGMENT_NODE |
Құжат фрагменті |
|
NOTATION_NODE |
Нотация |
|
Ағындағы бірнеше ықтимал түрлердегі обьекттен тұратын DOM құжаты ағаш болып табылады. Ағындар атрибуттар немесе деректер болуы мүмкін. Ағындарға қолжетімділікті childNodes (еншілес түйіндері), firstChild (бірінші еншілес түйіндері), lastChild (соңғы еншілес түйіндері), (ата-ана), nextSibling (келесі ағасы),previousSibling (алдыңғы ағасы).parentNode атрибуттары арқылы жүзеге асыруға болады.
Жоғарыда appendChild() әдісі арқылы айтылды. Оған insertBefore(newChild, refChild) (refChild-ге дейін newChild қою), removeChild(oldChild)
(еншілес түйіндерді өшіру), replaceChild(newChild, oldChild) (заметить oldChild на newChild) әдістерін қосуға болады. Тағыда ағындарды клондайтын (егер deep=1 берілген болса, еншілес түйіндермен бірге), cloneNode(deep) әдісі бар.
ELEMENT_NODE ағын түрі, аталғандардан басқа әдістер "жай ғана" торабының көптеген басқа әдістеріне ие. Міне олардың ішіндегі негізгілері:
tagName
Элемент түрінің аты.
getElementsByTagName(tagname)
Барлық берілген элементтерінің түрлерінің арасынан tagname атымен көрсетілген элементтерін алады.
getAttribute(attname)
attname атымен берілген атрибуттар мәнін алады.
getAttributeNode(attrname)
Обьект-ағын түріндегі attrname атымен берілген атрибутты қайтарады.
removeAttribute(attname)
attname атымен берілген атрибутты өшіреді.
removeAttributeNode(oldAttr)
oldAttr атрибутын өшіру (обьект-ағын түрінде берілген)
setAttribute(attname, value)
value жолына тең attname атрибутының мәнін белгілейді.
setAttributeNode(newAttr)
Элементке жаңа ағын-атрибут енгізеді. Егер сол атқа ие болса, ескі атрибут ауыстырылады.
Бұл жерде айта кету керек, атрибуттар элементтің аясында қайталанбауы тиіс. Олардың тәртібі, сондай-ақ XML ақпараттық моделінің тұрғысынан маңызды емес.
Жаттығу ретінде XML-ұсынуында берілген өрнектің мәнін шығаратын функцияларды құру ұсынылады.
