Стандартная библиотека Python

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Богатая стандартная библиотека является одной из привлекательных сторон языка программирования Python. Здесь имеются средства для работы со многими сетевыми протоколами и форматами интернета, например, модули для написания HTTP-серверов и клиентов, для разбора и создания почтовых сообщений, для работы с XML и т. п. Набор модулей для работы с операционной системой позволяет писать кросс-платформенные приложения. Существуют модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, сериализации данных, поддержка юнит-тестирования и др.

Сервисы периода исполнения[править | править вики-текст]

Модуль sys[править | править вики-текст]

В этом модуле содержатся функции и константы для взаимодействия с интерпретатором Python. В этом модуле в том числе содержатся следующие переменные:

  • argv — аргументы командной строки,
  • byteorder — порядок байтов платформы, 'little' или 'big',
  • flags — объект, предоставляющий в виде атрибутов информацию о флагах, данных интерпретатору. Например, sys.flags.debug говорит о режиме отладки,
  • maxint — максимальное целое,
  • platform — идентификатор платформы, например, 'linux-i386',
  • stdin, stdout, stderr — стандартные потоки ввода, вывода и вывода ошибок,
  • version — строка с версией,

и другие.

Модуль также содержит несколько функций[1].

Модуль contextlib[править | править вики-текст]

Модуль содержит вспомогательные функции для поддержки оператора with[2][3].

Пример использования менеджера контекста, при котором открытый файл автоматически закрывается:

with open('myfile.dat', 'wb') as fh:
    fh.write('Мои данные')

В примере выше был использован встроенный в Python менеджер контекста. API менеджера контекста состоит из двух методов:

  • Метод __enter__ вызывается при входе в блок with. Возвращает объект, который получает параметр, заданный as,
  • Метод __exit__ вызывается при выходе управления за пределы блока with.

Модуль contextlib предлагает декоратор для создания контекстного менеджера на базе генератора:

from contextlib import contextmanager
@contextmanager
def my_context():
    try:
        yield myvalue  # значение для as
    except MyError, e:
        # обработка исключения
    finally:
        # выполняется при любом исходе

Модуль abc[править | править вики-текст]

Модуль определяет метакласс ABCMeta и декораторы abstractmethod и abstractproperty для определения новых абстрактных базовых классов (англ. abstract base class)[4]. Следует отметить, что абстрактный базовый класс понимается здесь в ином смысле, нежели в C++[5].

Типы данных[править | править вики-текст]

Стандартная библиотека расширяет набор доступных Python типов данных[6]. Имеются отдельные типы данных для даты и времени, массива, кучи, очереди, слабые ссылки, а также так называемые абстрактные базовые типы из модуля collections.

Модуль datetime[править | править вики-текст]

Модуль datetime предоставляет пять классов: дата (date), время (time), комбинация даты и времени (datetime), разность дат и времени (timedelta) и временная зона (tzinfo)[7].

В следующем примере печатается экземпляр datetime, фиксирующий дату и время в момент вызова метода now():

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2013, 5, 11, 19, 47, 25, 375511)

Модуль collections[править | править вики-текст]

Данный модуль включает в себя набор специальных типов данных — контейнеров, которые дополняют стандартные встроенные типы dict, list, set и tuple. Например для Python 2.7: OrderedDict — упорядоченный (в порядке добавления элементов) словарь, defaultdict — словарь, вызывающий заданную функцию для отсутствующего в нём элемента, Counter — словарь, который удобно использовать для подсчёта слов, Deque — двусвязный список, namedtuple — кортеж с возможностью доступа к элементам по именам атрибутов. Также имеются абстрактные базовые классы Container, Sequence, Set, Mapping и другие[8][9].

Пример, демонстрирующий работу с дэком:

>>> from collections import deque
>>> d = deque('123')
>>> d[1]
'2'
>>> d.pop()
'3'
>>> d.appendleft('0')
>>> list(d)
['0', '1', '2']

Пример именованного кортежа для точки в трёхмерном пространстве:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y', 'z'])  # Определяем класс Точка
>>> a = Point(1.0, 2.0, 3.0)  # Экземпляр точки
>>> a.x + a.y + a.z  # Доступ по атрибутам
6.0
>>> a  # Так выглядит при печати
Point(x=1.0, y=2.0, z=3.0)
>>> a + (4.0, 5.0)  # Работает как кортеж
(1.0, 2.0, 3.0, 4.0, 5.0)

В Python 3.3 появился класс ChainMap, который позволяет создавать вложенные словари[10].

Пример, в котором поиск значения по ключу ведётся в заданном порядке в нескольких словарях:

>>> local_cfg = {'a': 4}
>>> user_cfg = {'a': 5}
>>> system_cfg = {'a': 5, 'b': 10}
>>> cm = ChainMap(local_cfg, user_cfg, system_cfg)
>>> cm['a'], cm['b']
(4, 10)
>>> local_cfg['b'] = 10
>>> cm['a'], cm['b']
(4, 10)

Взаимодействие с ОС[править | править вики-текст]

Модуль os[править | править вики-текст]

Модуль предоставляет функции переносимого интерфейса к основным сервисам операционной системы, определяет некоторые переменные (например, environ для доступа к переменным окружения)[11].

Модуль os.path[править | править вики-текст]

Модуль служит для манипуляций с путями к файлам в независимом от платформы виде. Пример иллюстрирует использование некоторых функций модуля:

>>> import os.path
>>> os.path.join("/tmp/1", "temp.file")  # конкатенация путей
'/tmp/1/temp.file'
>>> os.path.dirname("/tmp/1/temp.file")  # имя каталога по заданному полному пути
'/tmp/1'
>>> os.path.basename("/tmp/1/temp.file")  # имя файла по заданному полному пути
'temp.file'
>>> os.path.normpath("/tmp//2/../1/temp.file")  # нормализация пути 
'/tmp/1/temp.file'
>>> os.path.exists("/tmp/1/temp.file")  # существует ли путь?
False

Обработка текстов[править | править вики-текст]

Стандартная библиотека содержит несколько модулей для работы со строками и обработки текстов включают в себя следующие возможности[12].

Полезные константы и функции из модуля string[править | править вики-текст]

Модуль содержит различные константы, которые можно использовать при обработке текстов, например: ascii_letters (строка, содержащая все буквы из набора ASCII), ascii_lowercase, digits (строка с цифрами от 0 до 9), letters (буквы, зависят от установки локали) и т. п.

>>> from string import ascii_letters, ascii_lowercase, ascii_uppercase, digits
>>> ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> digits
'0123456789'

Сгенерировать пароль:

>>> chars = ascii_letters + digits
>>> from random import choice
>>> n = 8                            # длина пароля
>>> ''.join(choice(chars) for _ in range(n))
'ia1KGm2t'

Для упрощения подстановки в строки по ключевым словам могут использоваться экземпляры класса Template. Пример иллюстрирует методы substitute и safe_substitute:

>>> from string import Template
>>> tpl = Template("""${name} has ${amount}$$. {oh}""")
>>> tpl.substitute({"amount": 100, "name": "John"})
'John has 100$. {oh}'
>>> tpl.safe_substitute({"amount": 100})
'${name} has 100$. {oh}'
>>> # Для сравнения синтаксиса, метод format для строки: 
>>> """{name} has {amount}$. {{oh}}""".format(**{"amount": 100, "name": "John"})
'John has 100$. {oh}'

Поддержка регулярных выражений: модуль re[править | править вики-текст]

Регулярные выражения являются мощным средством обработки текста. Модуль re содержит функции для замены (sub), разбиения строки (split), сравнения строки с шаблоном (match, search), поиска (finditer, findall) и определяет классы для скомпилированного регулярного выражения и результата сравнения. Пример:

>>> import re
>>> compiled_re = re.compile(r"[a-b][0-9]*")
>>> [m.group(0) for m in compiled_re.finditer("A1 c123 a12, b abc (b987).")]
['a12', 'b', 'a', 'b', 'b987']

Работа с байтовыми структурами в модуле struct[править | править вики-текст]

Модуль struct служит для конвертирования данных из строк байтов и типами данных языка Python и может применяться при работе с форматами бинарных файлов и коммуникационными протоколами. Функции pack и unpack позволяют «упаковывать» и «распаковывать» данные на основе строки формата, состоящей их кодов форматирования, например:

>>> from struct import pack, unpack
>>> pack('hh', 1, 2)  # h - код для короткого целого со знаком
'\x01\x00\x02\x00'
>>> unpack('bbbb', 'ABCD')  # b соответствует символу со знаком
(65, 66, 67, 68)

Порядок байтов многобайтных данных можно задать в строке форматирования, например:

>>> pack('!l', 1025)  # сетевой (от старшего к младшему, big-endian)
'\x00\x00\x04\x01'
>>> pack('>l', 1025)  # от старшего к младшему, big-endian
'\x00\x00\x04\x01'
>>> pack('<l', 1025)  # от младшего к старшему, little-endian
'\x01\x04\x00\x00'

В модуле также определяется класс Struct, методы которого соответствуют функциям модуля.

Форматы данных[править | править вики-текст]

CSV[править | править вики-текст]

Для чтения и записи файла в формате CSV предназначен модуль csv. Этот модуль предназначен для работы с различными диалектами: разделитель запятая, разделитель точка с запятой, разделитель табуляция (Excel). Простейший пример:

import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
    print row

Модуль позволяет настроить формат читаемых и записываемых файлов. Например можно выставить разделитель полей :, разделитель строк — |, символ цитирования — ` (вместо " по умолчанию).

1 import csv
2 
3 with open("some.csv", "wb") as csv_fh:
4     writer = csv.writer(csv_fh, delimiter=':', quoting=csv.QUOTE_MINIMAL, quotechar='`', lineterminator='|')
5     writer.writerows([
6                       [1997, "Ford",  "E350", "ac, abs, moon", "3000.00"],
7                       [1999, "Chevy", "Venture `Extended Edition`", "", "4900.00"],
8                       [1996, "Jeep",  "Grand Cherokee", "air, moon roof, loaded MUST SELL!", "4799.00"] 
9                     ])

Работа с файловыми архивами[править | править вики-текст]

В стандартной библиотеке имеется поддержка для нескольких форматов архивов в виде следующих модулей: bz2 (bzip2), gzip (gzip), tarfile (tar), zipfile (zip), а также привязки к библиотеке zlib в виде модуля zlib[13].

Примеры для Python 2.7 и 3.2[править | править вики-текст]

В следующем примере в файле archive.zip будет заархивирован файл file.txt, содержащий текст «text in the file». Это ещё один пример использования менеджера контекста.

from zipfile import ZipFile
with ZipFile('archive.zip', 'w') as ziparc:
     ziparc.writestr('file.txt', 'text in the file')

Чтение архива происходит аналогично. В следующем примере будут напечатаны имена файлов, содержащиеся в архиве:

from zipfile import ZipFile
with ZipFile('archive.zip', 'r') as ziparc:
     for fileinfo in ziparc.filelist:
         print(fileinfo.filename)

Конфигурационные файлы[править | править вики-текст]

Для чтения и записи конфигурационных файлов предназначен модуль ConfigParser. Этот модуль написан на чистом Python и, следовательно, платформонезависим. Синтаксис конфигурационных файлов похож на тот, что используется в INI-файлах Windows. Например:

[My Section]
# some comment
foodir=%(dir)s/whatever
dir=frob
version: 1.0

В качестве разделителя ключа и значения может использоваться "=" или ":". При использовании классов ConfigParser и SafeConfigParser происходит замена строки %(<ключ>)s на значение параметра <ключ>. В указанном примере значение foodir будет равно frob/whatever. Строка, начинающаяся с символа "#" считается комментарием и игнорируется парсерами.

Криптографические модули[править | править вики-текст]

В силу различных причин (в том числе политических — во многих странах запрещена разработка и распространение криптографического программного обеспечения без разрешения соответствующих государственных структур) поддержка криптографии в стандартной библиотеке Python ограничена и сводится к хеш-функциям.

В версии 2.5 структура крипто-библиотеки была унифицирована — все хеш-функции собраны в модуль hashlib и удалены бесполезные модули некриптостойкого шифрования. Ранние модули md5, hmac, sha объявлены устаревшими и будут удалены в одном из последующих релизов.

Как и в некоторых других случаях (DB-API, Python Web Server Gateway Interface), при невозможности (или нецелесообразности) включить полноценную поддержку технологии в стандартную библиотеку были приняты стандарты на интерфейсы, предоставляемые внешними библиотеками, — API для хеш-функций, API для блочных шифров. Однако далеко не все библиотеки соответствуют этим требованиям (либо в силу старости — созданы до написания CryptoAPI, либо из-за того, что являются автоматически сгенерированными обёртками поверх соответствующих библиотек C).

Использовать CryptoAPI-совместимые библиотеки достаточно просто:

 >>> import hashlib
 >>> m = hashlib.new('md5')      # создаем новый хеширующий объект с MD5 функцией
 >>> m = hashlib.md5()           # либо так
 >>> m.update("test data")       # добавляем данные
 >>> m.digest()
 '\xebs:\x00\xc0\xc9\xd36\xe6V\x91\xa3z\xb5B\x93'
 >>> m.hexdigest()
 'eb733a00c0c9d336e65691a37ab54293'

hashlib обеспечивает поддержку следующих хеш-функций: MD5, SHA-1, SHA224, SHA256, SHA384, SHA512 (в сборках Python со включённой библиотекой OpenSSL этот список шире). Следует отметить, что одно только присутствие алгоритма в стандартной библиотеке не гарантирует его криптографическую надёжность. Так, алгоритмы MD5 и SHA-1 по состоянию на начало 2007 года не являются криптостойкими.

Для шифрования приходится использовать сторонние библиотеки, например, pycrypto (соответствует CryptoAPI) или M2Crypto (не соответствует CryptoAPI). Достаточно полный список представлен в PyPI[14].

Сетевые протоколы[править | править вики-текст]

В стандартной библиотеке присутствуют модули для работы с сетевыми протоколами HTTP (и клиент, и простейший сервер), FTP, XML-RPC, SMTP, IMAP, NNTP и другие.

Получение файла через HTTP(HTTPS)[править | править вики-текст]

Email[править | править вики-текст]

Модуль smtplib[править | править вики-текст]

Модуль предназначен для отправки сообщений электронной почты посредством протокола SMTP.

import smtplib

def send_email(text):
    server = smtplib.SMTP("smtp.server", 587)  # подключение к серверу
    server.ehlo()
    server.starttls()
    server.login("login", "password")  # логинимся на сервер
    message = "\r\n".join([   # формируем сообщение Email с полями
        "From: от кого", 
        "To: кому", 
        "Subject: тема", 
        "", 
        text,
        ])
    server.sendmail("login@server", "адрес почты получателя", message)  # отправляем
    server.quit()  # разлогиниваемся с сервера

send_email('Hello, World!')

Базы данных[править | править вики-текст]

Простые базы данных[править | править вики-текст]

Python поддерживает доступ к файлам в DBM-формате: Unix (n)dbm (модуль dbm в Python 2.x или dbm.ndbm в Python 3), GNU DBM (модуль gdbm), модуль, написанный на чистом Python, dumbdbm[15].

Работа с объектом базы данных происходит аналогично работе со словарём Python (на примере dumbdbm)[16]:

>>> import dumbdbm
>>> d = dumbdbm.open('my.db', 'w')  # открыть файл базы данных
>>> d['key'] = 'value'              # присвоить значение по ключу
>>> v = d['key']                    # получить значение по ключу
>>> d.sync()                        # записать изменения
>>> d.close()                       # закрыть базу данных

Для долговременного хранения объектов Python можно использовать модуль shelve (рус. полка).

SQLite[править | править вики-текст]

SQLite — это встраиваемая кроссплатформенная БД, которая поддерживает достаточно полный набор команд SQL и доступна в исходных кодах (на языке C). Начиная с Python 2.5, библиотека sqlite3 поставляется вместе с интерпретатором языка Python.

Для работы с библиотекой нужно создать объект Connection , который выступает в роли базы данных:

 1 import sqlite3
 2 conn = sqlite3.connect('example.db')
 3 c = conn.cursor()
 4 
 5 # Создаем таблицу
 6 c.execute('''CREATE TABLE stocks
 7              (date text, trans text, symbol text, qty real, price real)''')
 8 
 9 # Вставляем строку
10 c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
11 
12 # Сохраняем (и записываем) изменения
13 conn.commit()
14 
15 # После окончания работы мы можем закрыть соединение с ДБ
16 conn.close()

Поддержка разработки программного обеспечения[править | править вики-текст]

Многопоточные вычисления[править | править вики-текст]

Модуль threading предоставляет класс Thread, соответствующий потоку, а также классы для объектов синхронизации, такие как: блокировки Lock и RLock, Timer, семафоры Semaphore и BoundedSemaphore, условная переменная Condition, событие Event. Кроме этого, для организации очередей — FIFO, LIFO, очередь с приоритетом — применяется модуль queue (Queue в Python 2).

В Python нет средств для завершения или приостановки потоков, а также для освобождения всех блокировок[17].

Наличие в основной реализации Python глобальной блокировки интерпретатора (англ. Global Interpreter Lock, GIL) сильно ограничивает полезность многопоточных вычислений в счётных задачах[18].

Графический интерфейс[править | править вики-текст]

В стандартную поставку Python входит графическая библиотека Tkinter.

Интроспекция[править | править вики-текст]

Платформно-зависимые модули[править | править вики-текст]

Примечания[править | править вики-текст]

Ссылки[править | править вики-текст]

Литература[править | править вики-текст]

  • David M. Beazley. Python Essential Reference. — 4th Edition. — Addison-Wesley Professional, 2009. — 717 с. — ISBN 978-0672329784.
  • Doug Hellmann. The Python Standard Library by Example. — Addison-Wesley Professional, 2011. — 1344 с. — ISBN 978-0321767349.
  • Fredrik Lundh. Python Standard Library. — O'Reilly Media, 2001. — 281 с. — ISBN 978-0596000967.
  • Tarek Ziadé. Expert Python Programming. — Packt Publishing Ltd., 2008. — 372 с. — ISBN 978-1-847194-94-7.
  • Прохоренок Н. А. Python. Самое необходимое.. — БХВ-Петербург, 2011. — 416 с. — ISBN 978-5-9775-0614-4.