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

Материал из Циклопедии
Перейти к навигации Перейти к поиску

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

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

Модуль sys[править]

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

  • argv — аргументы командной строки,
  • byteorder — порядок байтов платформы, 'little' или 'big',
  • flags — объект, предоставляющий в виде атрибутов информацию о флагах, данных интерпретатору. Например, sys.flags.debug говорит о режиме отладки,
  • copyright — cтрока, содержащая авторские права, относящиеся к интерпретатору Python,
  • platform — идентификатор платформы, например, 'linux-i386',
  • stdin, stdout, stderr — стандартные потоки ввода, вывода и вывода ошибок,
  • version — строка с версией,
  • exit — выход из программы,
  • getrecursionlimit — возвращает лимит рекурсии,
  • platform — информация об операционной системе,
  • ps1, ps2 — первичное и вторичное приглашение интерпретатора (определены только если интерпретатор находится в интерактивном режиме). По умолчанию ps1 sys.ps1 == ">>> ", а sys.ps2 == "... ",
  • api_version — версия C API,
  • version_info — кортеж, содержащий пять компонентов номера версии,

и другие.

Модуль также содержит и другие сущности[1].

Модуль contextlib[править]

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

Пример использования менеджера контекста, при котором открытый файл автоматически закрывается: <source lang="python"> with open('myfile.dat', 'wb') as fh:

   fh.write('Мои данные')

</source>

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

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

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

<source lang="python"> from contextlib import contextmanager @contextmanager def my_context():

   try:
       yield myvalue  # значение для as
   except MyError, e:
       # обработка исключения
   finally:
       # выполняется при любом исходе

</source>

Модуль abc[править]

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

Типы данных[править]

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

Модуль datetime[править]

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

В следующем примере печатается экземпляр datetime, фиксирующий дату и время в момент вызова метода now(): <source lang="python"> >>> import datetime >>> datetime.datetime.now() datetime.datetime(2013, 5, 11, 19, 47, 25, 375511) </source>

Модуль collections[править]

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

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

<source lang="python"> >>> from collections import deque >>> d = deque('123') >>> d[1] '2' >>> d.pop() '3' >>> d.appendleft('0') >>> list(d) ['0', '1', '2'] </source>

Пример именованного кортежа для точки в трёхмерном пространстве: <source lang="python"> >>> 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) </source>

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

Пример, в котором поиск значения по ключу ведётся в заданном порядке в нескольких словарях: <source lang="python"> >>> 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) </source>

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

Модуль os[править]

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

Модуль os.path[править]

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

<source lang="python"> >>> 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 </source>

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

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

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

Модуль содержит различные константы, которые можно использовать при обработке текстов, например: ascii_letters (строка, содержащая все буквы из набора ASCII), ascii_lowercase, digits (строка с цифрами от 0 до 9), letters (буквы, зависят от установки локали) и т. п. <source lang="python"> >>> from string import ascii_letters, ascii_lowercase, ascii_uppercase, digits >>> ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> ascii_lowercase 'abcdefghijklmnopqrstuvwxyz' >>> ascii_uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> digits '0123456789' </source>

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

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

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

<source lang="python"> >>> 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}' </source>

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

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

<source lang="python"> >>> 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'] </source>

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

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

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

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

<source lang="python"> >>> 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' </source>

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

Форматы данных[править]

CSV[править]

Для чтения и записи файла в формате CSV предназначен модуль csv. Этот модуль предназначен для работы с различными диалектами: разделитель-запятая, разделитель — точка с запятой, разделитель — табуляция (Excel). Простейший пример: <source lang="python"> import csv reader = csv.reader(open("some.csv", "rb")) for row in reader:

   print(row)

</source>

Модуль позволяет настроить формат читаемых и записываемых файлов. Например, можно выставить разделитель полей :, разделитель строк — |, символ цитирования — ` (вместо " по умолчанию). <source lang="python" line="1"> import csv

with open("some.csv", "wb") as csv_fh:

   writer = csv.writer(csv_fh, delimiter=':', quoting=csv.QUOTE_MINIMAL, quotechar='`', lineterminator='|')
   writer.writerows([
                     [1997, "Ford",  "E350", "ac, abs, moon", "3000.00"],
                     [1999, "Chevy", "Venture `Extended Edition`", "", "4900.00"],
                     [1996, "Jeep",  "Grand Cherokee", "air, moon roof, loaded MUST SELL!", "4799.00"] 
                   ])

</source>

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

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

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

В следующем примере в файле archive.zip будет заархивирован файл file.txt, содержащий текст «text in the file». Это ещё один пример использования менеджера контекста. <source lang="python"> from zipfile import ZipFile with ZipFile('archive.zip', 'w') as ziparc:

    ziparc.writestr('file.txt', 'text in the file')

</source>

Чтение архива происходит аналогично. В следующем примере будут напечатаны имена файлов, содержащиеся в архиве: <source lang="python"> from zipfile import ZipFile with ZipFile('archive.zip', 'r') as ziparc:

    for fileinfo in ziparc.filelist:
        print(fileinfo.filename)

</source>

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

Для чтения и записи конфигурационных файлов предназначен модуль 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-совместимые библиотеки достаточно просто: <source lang="python">

>>> 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'

</source>

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)[править]

Получение картинки с сайта:

<syntaxhighlight lang="python"> from urllib import request

response = request.urlopen("https://ru.wikipedia.org/static/images/project-logos/ruwiki.png") with open("ruwiki.png","wb") as file:

  file.write(response.read())

</syntaxhighlight>

Email[править]

Модуль smtplib[править]

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

<source lang="python"> 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!') </source>

Базы данных[править]

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

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

Работа с объектом базы данных происходит аналогично работе со словарём Python (на примере dumbdbm)[16]: <source lang="python"> >>> import dumbdbm >>> d = dumbdbm.open('my.db', 'w') # открыть файл базы данных >>> d['key'] = 'value' # присвоить значение по ключу >>> v = d['key'] # получить значение по ключу >>> d.sync() # записать изменения >>> d.close() # закрыть базу данных </source>

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

SQLite[править]

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

Для работы с библиотекой нужно создать объект Connection , который выступает в роли базы данных: <syntaxhighlight lang="python3" line="1"> import sqlite3 conn = sqlite3.connect('example.db') c = conn.cursor()

  1. Создаем таблицу

c.execute(CREATE TABLE stocks

            (date text, trans text, symbol text, qty real, price real))
  1. Вставляем строку

c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")

  1. Сохраняем (и записываем) изменения

conn.commit()

  1. После окончания работы мы можем закрыть соединение с БД

conn.close() </syntaxhighlight>

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

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

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

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

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

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

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

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

 → Интроспекция в Python

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

Модуль platform позволяет получать платформозависимую информацию о системе, такую как версию дистрибутива Linux или версию операционной системы.[19]

Примечания[править]

  1. Beazley, 2009, pp. 229—235
  2. Ziadé, 2008, pp. 56—60
  3. Doug Hellman contextlib – Context manager utilities (англ.). Архивировано из первоисточника 18 октября 2012. Проверено 30 августа 2012.
  4. Beazley, 2009, pp. 257—259
  5. Python v2.7 documentation, The Python Standard Library, Python Runtime Services, Abstract Base Classes
  6. Data Types — Python 3 documentation
  7. Прохоренок, 2011, Глава 10. Работа с датой и временем
  8. Ziadé, 2008, pp. 303—306
  9. Beazley, 2009, pp. 262—265
  10. Python 3.3 Documentation, The Python Standard Library, Data Types
  11. Beazley, 2009, pp. 378—396
  12. Beazley, 2009, ch. 16
  13. Beazley, 2009, pp. 313—329
  14. Криптографические модули в каталоге PyPI
  15. Python v2.7 documentation, The Python Standard Library, anydbm — Generic access to DBM-style databases. Архивировано из первоисточника 16 сентября 2012.[недоступная ссылка] Проверено 15 сентября 2012.
  16. Beazley, 2009, pp. 310—311
  17. Beazley, 2009, pp. 436—444
  18. Beazley, 2009, pp. 444
  19. Python v2.7 Documentation, platform — Access to underlying platform’s identifying data

Литература[править]

  • 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.

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


Шаблон:Python