Документация Python неофициальный перевод
Содержание страницы

10. Краткий обзор стандартной библиотекиBrief Tour of the Standard Library

10.1. Интерфейс операционной системыOperating System Interface

Модуль os предоставляет десятки функций для взаимодействия с операционной системой:

>>> import os
>>> os.getcwd()      # Возвращает текущую рабочую директорию
'C:\\Python31'
>>> os.chdir('/server/accesslogs')   # Изменяет текущую рабочую директорию
>>> os.system('mkdir today')   # Выполняет команду mkdir в системной оболочке
0

Используйте стиль import os вместо from os import *. Это предотвратит затенение встроенной функции open() со стороны os.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')
>>> shutil.move('/build/executables', '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']

Модуль getopt обрабатывает sys.argv в соответствии с соглашениями функции getopt() из Unix. Более мощная и гибкая обработка командной строки предоставляется модулем argparse.

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

Проект SciPy <http://scipy.org> содержит много других модулей для численных вычислений.

10.7. Доступ к ИнтернетуInternet Access

Существует ряд модулей для доступа к интернету и обработки интернет-протоколов. Два самых простых – urllib.request для получения данных по URL и smtplib для отправки почты:

>>> from urllib.request import urlopen
>>> for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
...     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, 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 предоставляет инструмент для сканирования модуля и проверки тестов, встроенных в строки документации программы. Создание теста так же просто, как копирование и вставка типичного вызова вместе с его результатами в строку документации. Это улучшает документацию, предоставляя пользователю пример, и позволяет модулю 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)
        self.assertRaises(ZeroDivisionError, average, [])
        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 предоставляет полный набор инструментов для построения или декодирования сложных структур сообщений (включая вложения), а также для реализации интернет-кодировок и заголовочных протоколов.
  • Пакеты xml.dom и xml.sax предоставляют надежную поддержку для разбора этого популярного формата обмена данными. Аналогично, модуль csv поддерживает прямые чтение и запись в распространенном формате баз данных. Вместе эти модули и пакеты значительно упрощают обмен данными между приложениями Python и другими инструментами.
  • Интернационализация поддерживается несколькими модулями, включая gettext, locale и пакет codecs.