Содержание страницы
10. Краткий обзор стандартной библиотеки¶Brief Tour of the Standard Library
10.1. Интерфейс операционной системы¶Operating System Interface
Модуль os предоставляет десятки функций для взаимодействия с операционной системой:
>>> import os
>>> os.getcwd() # Возвращает текущую рабочую директорию
'C:\\Python38'
>>> os.chdir('/server/accesslogs') # Изменяет текущую рабочую директорию
>>> os.system('mkdir today') # Выполняет команду mkdir в системной оболочке
0
Обязательно используйте стиль import os вместо from os import *. Это
не позволит os.open() затенять встроенную функцию open(), которая
работает совсем иначе.
Встроенные функции dir() и help() полезны в качестве интерактивных
средств для работы с большими модулями, такими как os:
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
Для повседневных задач управления файлами и каталогами модуль shutil предоставляет
интерфейс более высокого уровня, который проще в использовании:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
10.2. Шаблоны файлов¶File Wildcards
Модуль glob предоставляет функцию для составления списков файлов по
поиску с шаблонами каталогов:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
10.3. Аргументы командной строки¶Command Line Arguments
Часто служебным скриптам требуется обрабатывать аргументы командной строки. Эти
аргументы хранятся в виде списка в атрибуте argv модуля sys. Например, следующий вывод получен при запуске python demo.py one two
three из командной строки:
>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']
Модуль argparse предоставляет более сложный механизм для обработки
аргументов командной строки. Следующий сценарий извлекает одно или несколько имён файлов
и необязательное количество строк для отображения:
import argparse
parser = argparse.ArgumentParser(prog = 'top',
description = 'Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)
При запуске в командной строке с python top.py --lines=5 alpha.txt
beta.txt сценарий устанавливает args.lines в 5 и args.filenames
в ['alpha.txt', 'beta.txt'].
10.4. Перенаправление вывода ошибок и завершение программы¶Error Output Redirection and Program Termination
Модуль sys также имеет атрибуты для stdin, stdout и stderr.
Последний полезен для вывода предупреждений и сообщений об ошибках, чтобы они были
видны, даже если stdout был перенаправлен:
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
Самый прямой способ завершить сценарий – использовать sys.exit().
10.5. Сопоставление строк с шаблоном¶String Pattern Matching
Модуль re предоставляет инструменты регулярных выражений для продвинутой обработки
строк. Для сложного сопоставления и манипуляций регулярные выражения предлагают
краткие, оптимизированные решения:
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
Когда нужны только простые возможности, предпочтительнее строковые методы, поскольку их легче читать и отлаживать:
>>> 'tea for too'.replace('too', 'two')
'tea for two'
10.6. Математика¶Mathematics
Модуль math предоставляет доступ к функциям базовой библиотеки C для
работы с числами с плавающей запятой:
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
Модуль random предоставляет инструменты для случайного выбора:
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10) # выборка без возвращения
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # случайное число с плавающей запятой
0.17970987693706186
>>> random.randrange(6) # случайное целое число из range(6)
4
Модуль statistics вычисляет основные статистические свойства
(среднее, медиану, дисперсию и т. д.) числовых данных:
>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095
Проект SciPy <https://scipy.org> содержит множество других модулей для численных расчётов.
10.7. Доступ в Интернет¶Internet Access
Существует ряд модулей для доступа в Интернет и обработки интернет-протоколов.
Два самых простых – urllib.request для получения данных
по URL и smtplib для отправки почты:
>>> from urllib.request import urlopen
>>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
... for line in response:
... line = line.decode('utf-8') # Декодирование двоичных данных в текст.
... if 'EST' in line or 'EDT' in line: # поиск восточного времени
... print(line)
<BR>Nov. 25, 09:43:32 PM EST
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """Кому: jcaesar@example.org
... От: soothsayer@example.org
...
... Остерегайтесь мартовских ид.
... """)
>>> server.quit()
(Обратите внимание, что второй пример требует работающего почтового сервера на localhost.)
10.8. Даты и время¶Dates and Times
Модуль datetime предоставляет классы для работы с датами и временем как в простых, так и в сложных сценариях. Хотя арифметика дат и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению членов для форматирования вывода и манипуляций. Модуль также поддерживает объекты, учитывающие часовой пояс.
>>> # даты легко создаются и форматируются
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
>>> # даты поддерживают календарные вычисления
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
10.9. Сжатие данных¶Data Compression
Распространённые форматы архивирования и сжатия данных напрямую поддерживаются модулями: zlib, gzip, bz2, lzma, zipfile и tarfile.
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
10.10. Измерение производительности¶Performance Measurement
Некоторые пользователи Python проявляют глубокий интерес к сравнению производительности различных подходов к одной и той же задаче. Python предоставляет инструмент измерения, который сразу даёт ответы на эти вопросы.
Например, может возникнуть соблазн использовать упаковку и распаковку кортежей вместо традиционного способа обмена аргументами. Модуль timeit быстро демонстрирует небольшое преимущество в производительности:
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
В отличие от высокой детализации timeit, модули profile и pstats предоставляют инструменты для выявления критичных по времени участков в более крупных блоках кода.
10.11. Контроль качества¶Quality Control
Один из подходов к разработке качественного программного обеспечения – писать тесты для каждой функции по мере её создания и регулярно запускать их в процессе разработки.
Модуль doctest предоставляет инструмент для сканирования модуля и проверки тестов, встроенных в строки документации программы. Создание тестов сводится к копированию типичного вызова вместе с результатами в docstring. Это улучшает документацию, предоставляя пользователю пример, а также позволяет модулю doctest гарантировать, что код соответствует документации:
def average(values):
"""Вычисляет среднее арифметическое списка чисел.
>>> print(average([20, 30, 70]))
40.0
"""
return sum(values) / len(values)
import doctest
doctest.testmod() # Автоматически проверяет встроенные тесты
Модуль unittest не так прост в использовании, как doctest, но позволяет поддерживать более полный набор тестов в отдельном файле:
import unittest
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
with self.assertRaises(ZeroDivisionError):
average([])
with self.assertRaises(TypeError):
average(20, 30, 70)
unittest.main() # Вызов из командной строки запускает все тесты
10.12. Батарейки в комплекте¶Batteries Included
Python придерживается философии «батарейки в комплекте». Это лучше всего видно на примере сложных и мощных возможностей его крупных пакетов. Например:
Модули
xmlrpc.clientиxmlrpc.serverделают реализацию удалённых вызовов процедур почти тривиальной задачей. Несмотря на названия модулей, не требуется прямого знания или обработки XML.Пакет
email– библиотека для управления сообщениями электронной почты, включая документы сообщений на основе MIME и других RFC 2822. В отличие отsmtplibиpoplib, которые непосредственно отправляют и получают сообщения, пакет email предоставляет полный набор инструментов для создания и декодирования сложных структур сообщений (включая вложения) и для реализации интернет-кодирования и протоколов заголовков.Пакет
jsonобеспечивает надёжную поддержку разбора этого популярного формата обмена данными. Модульcsvподдерживает прямое чтение и запись файлов в формате CSV (значения, разделённые запятыми), который часто используется базами данных и электронными таблицами. Обработка XML поддерживается пакетамиxml.etree.ElementTree,xml.domиxml.sax. Вместе эти модули и пакеты значительно упрощают обмен данными между приложениями Python и другими инструментами.Модуль
sqlite3является обёрткой для библиотеки баз данных SQLite, предоставляя постоянную базу данных, которую можно обновлять и к которой можно обращаться с помощью слегка нестандартного синтаксиса SQL.Интернационализация поддерживается рядом модулей, включая
gettext,localeи пакетcodecs.