Стандартная библиотека 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