> **Источник:** https://python-all.ru/2.7/tutorial/stdlib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 10. Краткий обзор стандартной библиотеки

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

Модуль [`os`](https://python-all.ru/2.7/library/os.html#module-os) предоставляет десятки функций для взаимодействия с операционной системой:

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

Обязательно используйте стиль `import os` вместо `from os import *`. Это не позволит [`os.open()`](https://python-all.ru/2.7/library/os.html#os.open) затенять встроенную функцию [`open()`](https://python-all.ru/2.7/library/functions.html#open), которая работает совсем иначе.

Встроенные функции [`dir()`](https://python-all.ru/2.7/library/functions.html#dir) и [`help()`](https://python-all.ru/2.7/library/functions.html#help) полезны в качестве интерактивных средств для работы с большими модулями, такими как [`os`](https://python-all.ru/2.7/library/os.html#module-os):

```python
>>> 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`](https://python-all.ru/2.7/library/shutil.html#module-shutil) предоставляет интерфейс более высокого уровня, который проще в использовании:

```python
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')
```

## 10.2. Шаблоны файлов

Модуль [`glob`](https://python-all.ru/2.7/library/glob.html#module-glob) предоставляет функцию для составления списков файлов по поиску с шаблонами каталогов:

```python
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
```

## 10.3. Аргументы командной строки

Часто служебным скриптам требуется обрабатывать аргументы командной строки. Эти аргументы хранятся в виде списка в атрибуте *argv* модуля [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys). Например, следующий вывод получен при запуске `python demo.py one two three` из командной строки:

```python
>>> import sys
>>> print sys.argv
['demo.py', 'one', 'two', 'three']
```

Модуль [`getopt`](https://python-all.ru/2.7/library/getopt.html#module-getopt) обрабатывает *sys.argv* в соответствии с соглашениями функции Unix [`getopt()`](https://python-all.ru/2.7/library/getopt.html#module-getopt). Более мощная и гибкая обработка командной строки обеспечивается модулем [`argparse`](https://python-all.ru/2.7/library/argparse.html#module-argparse).

## 10.4. Перенаправление вывода ошибок и завершение программы

Модуль [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys) также имеет атрибуты для *stdin*, *stdout* и *stderr*. Последний полезен для вывода предупреждений и сообщений об ошибках, чтобы они были видны, даже если *stdout* был перенаправлен:

```python
>>> 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. Сопоставление строк с шаблоном

Модуль [`re`](https://python-all.ru/2.7/library/re.html#module-re) предоставляет инструменты регулярных выражений для продвинутой обработки строк. Для сложного сопоставления и манипуляций регулярные выражения предлагают краткие, оптимизированные решения:

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

Когда нужны только простые возможности, предпочтительнее строковые методы, поскольку их легче читать и отлаживать:

```python
>>> 'tea for too'.replace('too', 'two')
'tea for two'
```

## 10.6. Математика

Модуль [`math`](https://python-all.ru/2.7/library/math.html#module-math) предоставляет доступ к функциям базовой библиотеки C для работы с числами с плавающей запятой:

```python
>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
>>> math.log(1024, 2)
10.0
```

Модуль [`random`](https://python-all.ru/2.7/library/random.html#module-random) предоставляет инструменты для случайного выбора:

```python
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(xrange(100), 10)   # выборка без возвращения
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # случайное число с плавающей запятой
0.17970987693706186
>>> random.randrange(6)    # случайное целое число из range(6)
4
```

## 10.7. Доступ в Интернет

Существует множество модулей для доступа к интернету и обработки интернет-протоколов. Два самых простых – [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2) для получения данных из URL-адресов и [`smtplib`](https://python-all.ru/2.7/library/smtplib.html#module-smtplib) для отправки почты:

```python
>>> import urllib2
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
...     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. Даты и время

Модуль [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) предоставляет классы для работы с датами и временем как в простых, так и в сложных сценариях. Хотя арифметика дат и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению членов для форматирования вывода и манипуляций. Модуль также поддерживает объекты, учитывающие часовой пояс.

```python
>>> # даты легко создаются и форматируются
>>> 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. Сжатие данных

Распространённые форматы архивирования и сжатия данных напрямую поддерживаются модулями, включая: [`zlib`](https://python-all.ru/2.7/library/zlib.html#module-zlib), [`gzip`](https://python-all.ru/2.7/library/gzip.html#module-gzip), [`bz2`](https://python-all.ru/2.7/library/bz2.html#module-bz2), [`zipfile`](https://python-all.ru/2.7/library/zipfile.html#module-zipfile) и [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile).

```python
>>> import zlib
>>> s = 'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
```

## 10.10. Измерение производительности

Некоторые пользователи Python проявляют глубокий интерес к сравнению производительности различных подходов к одной и той же задаче. Python предоставляет инструмент измерения, который сразу даёт ответы на эти вопросы.

Например, может возникнуть соблазн использовать упаковку и распаковку кортежей вместо традиционного способа обмена аргументами. Модуль [`timeit`](https://python-all.ru/2.7/library/timeit.html#module-timeit) быстро демонстрирует небольшое преимущество в производительности:

```python
>>> 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`](https://python-all.ru/2.7/library/timeit.html#module-timeit), модули [`profile`](https://python-all.ru/2.7/library/profile.html#module-profile) и [`pstats`](https://python-all.ru/2.7/library/profile.html#module-pstats) предоставляют инструменты для выявления критичных по времени участков в более крупных блоках кода.

## 10.11. Контроль качества

Один из подходов к разработке качественного программного обеспечения – писать тесты для каждой функции по мере её создания и регулярно запускать их в процессе разработки.

Модуль [`doctest`](https://python-all.ru/2.7/library/doctest.html#module-doctest) предоставляет инструмент для сканирования модуля и проверки тестов, встроенных в строки документации программы. Создание тестов сводится к копированию типичного вызова вместе с результатами в docstring. Это улучшает документацию, предоставляя пользователю пример, а также позволяет модулю doctest гарантировать, что код соответствует документации:

```python
def average(values):
    """Вычисляет среднее арифметическое списка чисел.

    >>> print average([20, 30, 70])
    40.0
    """
    return sum(values, 0.0) / len(values)

import doctest
doctest.testmod()   # Автоматически проверяет встроенные тесты
```

Модуль [`unittest`](https://python-all.ru/2.7/library/unittest.html#module-unittest) не так прост в использовании, как [`doctest`](https://python-all.ru/2.7/library/doctest.html#module-doctest), но позволяет поддерживать более полный набор тестов в отдельном файле:

```python
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. Батарейки в комплекте

Python придерживается философии «батарейки в комплекте». Это лучше всего видно на примере сложных и мощных возможностей его крупных пакетов. Например:

- Модули [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) и [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#module-SimpleXMLRPCServer) делают реализацию удалённых вызовов процедур почти тривиальной задачей. Несмотря на названия модулей, не требуется прямого знания или обработки XML.
- Пакет [`email`](https://python-all.ru/2.7/library/email.html#module-email) представляет собой библиотеку для управления электронными письмами, включая сообщения в формате MIME и других RFC 2822. В отличие от [`smtplib`](https://python-all.ru/2.7/library/smtplib.html#module-smtplib) и [`poplib`](https://python-all.ru/2.7/library/poplib.html#module-poplib), которые фактически отправляют и получают сообщения, пакет email содержит полный набор инструментов для создания и декодирования сложных структур сообщений (включая вложения) и для реализации интернет-кодирования и протоколов заголовков.
- Пакеты [`xml.dom`](https://python-all.ru/2.7/library/xml.dom.html#module-xml.dom) и [`xml.sax`](https://python-all.ru/2.7/library/xml.sax.html#module-xml.sax) обеспечивают надёжную поддержку разбора этого популярного формата обмена данными. Аналогично, модуль [`csv`](https://python-all.ru/2.7/library/csv.html#module-csv) поддерживает прямое чтение и запись в распространённом формате базы данных. Вместе эти модули и пакеты значительно упрощают обмен данными между приложениями Python и другими инструментами.
- Интернационализация поддерживается рядом модулей, включая [`gettext`](https://python-all.ru/2.7/library/gettext.html#module-gettext), [`locale`](https://python-all.ru/2.7/library/locale.html#module-locale) и пакет [`codecs`](https://python-all.ru/2.7/library/codecs.html#module-codecs).
