Django-Admin.ru

Стандартная библиотека Python: самые полезные модули

Стандартная библиотека Python по задачам: файлы, даты, JSON и CSV, регулярные выражения, коллекции, процессы, сеть, тесты. Что удалено в 3.13 и нового в 3.15.

Редакция Django-Admin.ru
· 20 мин чтения

Содержание · 16 разделов
  1. Что входит в стандартную библиотеку
  2. Таблица: задача → модуль
  3. Файлы и пути: pathlib, shutil, tempfile
  4. Даты и время: datetime, zoneinfo, time
  5. Текст и регулярные выражения: re, textwrap, difflib
  6. Данные и форматы: json, csv, sqlite3, tomllib
  7. Коллекции и итераторы: collections, itertools, functools
  8. Математика и случайность: math, statistics, decimal, random, secrets
  9. Процессы и параллельность: subprocess, concurrent.futures, asyncio
  10. Сеть и интернет: urllib, http.server, smtplib
  11. Отладка, логирование и тестирование
  12. Командная строка: argparse и готовые утилиты python -m
  13. Что удалено из стандартной библиотеки
  14. Что нового в Python 3.14 и 3.15
  15. Частые вопросы
  16. Почему import random выдаёт AttributeError?
  17. Можно ли посмотреть исходный код модуля?
  18. Почему в Linux нет venv или tkinter, хотя они входят в стандартную библиотеку?
  19. Есть ли документация стандартной библиотеки на русском?
  20. Нужно ли учить всю стандартную библиотеку?
  21. Итог

Стандартная библиотека Python — это около двухсот модулей, которые устанавливаются вместе с интерпретатором и подключаются через import без pip install. На каждый день хватает двух десятков: pathlib и shutil для файлов, datetime для дат, json, csv и sqlite3 для данных, re для поиска по тексту, collections и itertools для коллекций, subprocess и concurrent.futures для процессов, logging, unittest и argparse для отладки, тестов и командной строки.

import json                 # стандартная библиотека — ставить не нужно
from pathlib import Path    # тоже

data = json.loads(Path("config.json").read_text(encoding="utf-8"))

Ниже — таблица «задача → модуль», короткие рабочие примеры по каждой группе задач, готовые консольные утилиты python -m, список удалённых модулей и новинки Python 3.14 и 3.15. Примеры проверены на Python 3.12 и 3.15; если пример требует более новой версии, это указано рядом. Чем стандартная библиотека отличается от пакетов из PyPI и как их ставить, рассказано в обзоре библиотек Python.

Что входит в стандартную библиотеку

В неё входят модули на чистом Python (pathlib, json, logging), модули, написанные на C или работающие поверх C-библиотек (math, socket, sqlite3, ssl) и встроенные функции вроде print(), len() и open() — они доступны даже без import. В Python 3.15 список sys.stdlib_module_names содержит 192 публичных имени верхнего уровня, не считая подмодулей вроде os.path или urllib.request. Часть модулей работает только на одной платформе: winreg и msvcrt есть лишь в Windows, pwd, fcntl и termios — только в Unix.

Проверить, относится ли модуль к стандартной библиотеке, можно прямо из кода (Python 3.10+):

import sys

print("pathlib" in sys.stdlib_module_names)   # → True
print("requests" in sys.stdlib_module_names)  # → False

Модули обновляются вместе с интерпретатором: tomllib появился в 3.11, itertools.batched() — в 3.12, uuid.uuid7() — в 3.14. Узнать свою версию поможет python --version (Windows) или python3 --version (macOS и Linux).

Важно: некоторые дистрибутивы Linux разносят стандартную библиотеку по отдельным системным пакетам. В Debian и Ubuntu для python3 -m venv нужен пакет python3-venv, для tkinter — python3-tk. В Windows у zoneinfo нет встроенной базы часовых поясов — её ставят пакетом tzdata из PyPI.

Таблица: задача → модуль

ЗадачаМодуль стандартной библиотекиКогда нужен пакет из PyPI
Пути, обход папок, чтение файловpathlib, os, globСлежение за изменениями файлов — watchdog
Копирование, перемещение, архивыshutil, zipfile, tarfile, tempfileФорматы RAR и 7z
Даты, время, часовые поясаdatetime, zoneinfo, time, calendarРазбор дат в свободной форме — python-dateutil
Регулярные выражения и работа с текстомre, string, textwrap, difflibНечёткий поиск по большим объёмам — rapidfuzz
JSON, CSV, TOML, конфигурацииjson, csv, tomllib, configparserЗапись TOML — tomli-w; таблицы Excel — openpyxl; анализ — pandas
Встроенная база данныхsqlite3, dbm, shelvePostgreSQL и MySQL — psycopg, mysqlclient
Счётчики, очереди, группировкаcollections, itertools, functools—
Классы для хранения данныхdataclasses, enum, typingВалидация входных данных — pydantic
Математика, статистика, деньгиmath, statistics, decimal, fractionsМассивы и матрицы — NumPy
Случайные числа и токеныrandom, secrets, uuid—
Хеши и подписиhashlib, hmac, base64Шифрование — cryptography
Запуск программ и командsubprocess, shlex, os—
Параллельностьconcurrent.futures, threading, multiprocessing, asyncioОчереди задач между серверами — Celery
HTTP-запросы и URLurllib.request, urllib.parse, httpУдобный HTTP-клиент — requests, httpx
Почтаsmtplib, email, imaplib—
Логирование и отладкаlogging, pdb, traceback, timeit—
Тестыunittest, doctest, unittest.mockТесты на простых функциях с assert — pytest
Аргументы командной строкиargparse, sys.argv, getpassСложные CLI с подкомандами — click, typer
Графический интерфейсtkinterСовременные виджеты — PySide6

Файлы и пути: pathlib, shutil, tempfile

pathlib.Path объединяет работу с путями и файлами: склеивает пути оператором /, разбирает имя и расширение, ищет файлы по шаблону, читает и пишет текст. Модуль os по-прежнему нужен для переменных окружения (os.environ) и низкоуровневых операций, shutil — для копирования папок, удаления деревьев и архивов, tempfile — для временных файлов и папок, которые удалятся сами.

import shutil
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as tmp:
    root = Path(tmp)
    reports = root / "reports"
    reports.mkdir()
    (reports / "jan.csv").write_text("id;sum\n1;100\n", encoding="utf-8")
    (reports / "feb.csv").write_text("id;sum\n2;250\n", encoding="utf-8")

    for path in sorted(reports.glob("*.csv")):
        lines = path.read_text(encoding="utf-8").splitlines()
        print(path.name, path.stem, path.suffix, len(lines))

    archive = shutil.make_archive(str(root / "backup"), "zip", reports)
    print(Path(archive).name)
feb.csv feb .csv 2
jan.csv jan .csv 2
backup.zip

Всегда передавайте encoding="utf-8" при чтении и записи текста. До Python 3.15 без этого аргумента бралась кодировка системы: в Windows с русской локалью это cp1251, и файл, сохранённый в Linux, читался кракозябрами. С 3.15 кодировкой по умолчанию стала UTF-8, но явный аргумент сохраняет одинаковое поведение во всех версиях.

Даты и время: datetime, zoneinfo, time

datetime хранит дату и время, timedelta — интервал, zoneinfo (Python 3.9+) подключает часовые пояса из базы IANA. Для замера длительности используйте time.perf_counter(): системные часы time.time() могут сдвинуться при синхронизации.

from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

moscow = ZoneInfo("Europe/Moscow")
start = datetime(2026, 10, 10, 18, 0, tzinfo=moscow)
deadline = start + timedelta(days=3, hours=6)

print(deadline.isoformat())
print(deadline.astimezone(ZoneInfo("Asia/Novosibirsk")).strftime("%d.%m.%Y %H:%M"))
print((deadline - start).total_seconds() / 3600, "ч")
2026-10-14T00:00:00+03:00
14.10.2026 04:00
78.0 ч

В Windows этот пример без пакета tzdata упадёт с ZoneInfoNotFoundError — установите его командой pip install tzdata. Форматы strftime, разбор строк и подсчёт возраста разобраны в статье про datetime в Python.

Текст и регулярные выражения: re, textwrap, difflib

Модуль re ищет и заменяет по шаблону: findall() возвращает все совпадения, finditer() — объекты с группами, sub() заменяет найденное. Для простых задач хватает методов строк (split, replace, startswith) — регулярное выражение нужно, когда шаблон сложнее фиксированной подстроки.

import difflib
import re
import textwrap

text = "Заказ A-17 от 10.10.2026, заказ B-203 от 11.10.2026"

print(re.findall(r"[A-Z]-\d+", text))
for m in re.finditer(r"(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{4})", text):
    print(m["year"], m["month"], m["day"])
print(re.sub(r"\s+", " ", "лишние   пробелы\tи\nпереносы"))

print(difflib.get_close_matches("pyhton", ["python", "pytest", "pandas"]))
print(textwrap.shorten("Стандартная библиотека Python поставляется вместе с интерпретатором", width=40))
['A-17', 'B-203']
2026 10 10
2026 10 11
лишние пробелы и переносы
['python']
Стандартная библиотека Python [...]

Шаблоны записывайте сырыми строками r"...", иначе обратные слеши придётся удваивать. difflib.get_close_matches() пригодится для подсказок «Возможно, вы имели в виду…», а difflib.unified_diff() сравнивает два текста построчно, как git diff. Для перебора символов и сборки строк без регулярных выражений есть string с наборами ascii_letters, digits и punctuation.

Данные и форматы: json, csv, sqlite3, tomllib

Четыре модуля закрывают большинство задач с данными без сторонних пакетов:

  • json — обмен с веб-API и конфигурации; для кириллицы передавайте ensure_ascii=False;
  • csv — таблицы из Excel и выгрузок; DictReader и DictWriter работают со строками как со словарями;
  • sqlite3 — полноценная SQL-база в одном файле, без сервера;
  • tomllib (Python 3.11+) — чтение файлов TOML, например pyproject.toml; записи в TOML в стандартной библиотеке нет.
import csv
import io
import json
import sqlite3

rows = [
    {"name": "Анна", "city": "Казань"},
    {"name": "Борис", "city": "Омск"},
]

buffer = io.StringIO()
writer = csv.DictWriter(buffer, fieldnames=["name", "city"])
writer.writeheader()
writer.writerows(rows)
print(buffer.getvalue().splitlines())

print(json.dumps(rows[0], ensure_ascii=False))

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE users (name TEXT, city TEXT)")
con.executemany("INSERT INTO users VALUES (:name, :city)", rows)
print(con.execute("SELECT name FROM users WHERE city = ?", ("Омск",)).fetchone())
con.close()
['name,city', 'Анна,Казань', 'Борис,Омск']
{"name": "Анна", "city": "Казань"}
('Борис',)

При записи CSV в файл открывайте его с newline="", иначе в Windows между строками появятся пустые. В SQL подставляйте значения через ? или именованные параметры, а не f-строкой — так запрос защищён от SQL-инъекций. Подробно про dumps, loads и сериализацию дат — в статье JSON в Python.

TOML читается в обычный словарь:

import tomllib

config = tomllib.loads("""
[server]
host = "127.0.0.1"
port = 8000
debug = true
""")
print(config["server"]["port"], config["server"]["debug"])  # → 8000 True

Файл открывайте в двоичном режиме: tomllib.load(open("pyproject.toml", "rb")).

Важно: pickle сохраняет почти любой объект Python, но при загрузке может выполнить произвольный код. Загружайте через pickle.load() только файлы, которые создали сами; для обмена данными с другими программами используйте JSON.

Коллекции и итераторы: collections, itertools, functools

Эти модули заменяют самописные циклы:

  • collections.Counter считает частоты, defaultdict группирует без проверки ключа, deque — очередь с быстрым добавлением и удалением с обоих концов;
  • itertools строит ленивые цепочки: batched() (3.12+) режет поток на пачки, pairwise() даёт соседние пары, groupby() группирует подряд идущие элементы, chain() склеивает последовательности;
  • functools.cache запоминает результаты функции, partial фиксирует часть аргументов, wraps нужен в каждом декораторе;
  • dataclasses создаёт классы для хранения данных без ручного __init__ и __repr__;
  • heapq и bisect — куча для «топ-N» и двоичный поиск в отсортированном списке.
from collections import Counter, defaultdict, deque
from dataclasses import dataclass
from functools import cache
from itertools import batched, pairwise

words = "кот пёс кот рыба кот пёс".split()
print(Counter(words).most_common(2))

by_length = defaultdict(list)
for word in words:
    by_length[len(word)].append(word)
print(dict(by_length))

last_three = deque(maxlen=3)
for n in range(6):
    last_three.append(n)
print(list(last_three))

print(list(batched(range(7), 3)))
print([b - a for a, b in pairwise([10, 12, 11, 15])])


@cache
def fib(n: int) -> int:
    return n if n < 2 else fib(n - 1) + fib(n - 2)


print(fib(80))


@dataclass
class Order:
    id: str
    total: float = 0.0


print(Order("A-17", 990.0))
[('кот', 3), ('пёс', 2)]
{3: ['кот', 'пёс', 'кот', 'кот', 'пёс'], 4: ['рыба']}
[3, 4, 5]
[(0, 1, 2), (3, 4, 5), (6,)]
[2, -1, 4]
23416728348467685
Order(id='A-17', total=990.0)

itertools.groupby() объединяет только соседние одинаковые элементы, как uniq в Unix: перед группировкой отсортируйте данные по тому же ключу или используйте defaultdict(list), как в примере.

Математика и случайность: math, statistics, decimal, random, secrets

  • math — корни, округление вверх и вниз, логарифмы, тригонометрия, сочетания comb(), сравнение дробных чисел isclose();
  • statistics — среднее, медиана, мода, стандартное отклонение;
  • decimal — точная десятичная арифметика для денег, fractions — обыкновенные дроби;
  • random — случайные числа для игр, тестов и симуляций;
  • secrets — криптостойкие токены и пароли.
import math
import random
import secrets
import statistics
from decimal import Decimal
from fractions import Fraction

print(0.1 + 0.2 == 0.3, math.isclose(0.1 + 0.2, 0.3))
print(Decimal("0.1") + Decimal("0.2"))
print(Fraction(1, 3) + Fraction(1, 6))
print(math.ceil(7 / 2), math.sqrt(16), math.comb(5, 2))
print(statistics.mean([3, 5, 8]), statistics.median([3, 5, 8, 100]))

random.seed(42)
print(random.randint(1, 6), random.choice(["орёл", "решка"]))
print(len(secrets.token_urlsafe(16)))
False True
0.3
1/2
4 4.0 10
5.333333333333333 6.5
6 орёл
22

Decimal создавайте из строки: Decimal(0.1) унаследует погрешность двоичного float. random.seed() делает последовательность воспроизводимой, поэтому для паролей и кодов подтверждения random не подходит — только secrets. Все функции random с примерами — в статье модуль random.

Процессы и параллельность: subprocess, concurrent.futures, asyncio

subprocess.run() запускает внешнюю программу и ждёт её завершения. Передавайте команду списком аргументов: shell=True с данными от пользователя открывает дорогу к внедрению команд. check=True превращает ненулевой код возврата в исключение, timeout не даёт зависшему процессу заблокировать скрипт.

Для параллельной работы есть три подхода:

  • concurrent.futures.ThreadPoolExecutor — потоки для задач, которые ждут сеть или диск;
  • concurrent.futures.ProcessPoolExecutor и multiprocessing — отдельные процессы для тяжёлых вычислений на нескольких ядрах;
  • asyncio — тысячи одновременных сетевых операций в одном потоке; подробно — в статье async и await в Python.
import subprocess
import sys
import time
from concurrent.futures import ThreadPoolExecutor

result = subprocess.run(
    [sys.executable, "-c", "print('привет из дочернего процесса')"],
    capture_output=True, text=True, check=True, timeout=10,
)
print(result.returncode, result.stdout.strip())


def slow_square(n: int) -> int:
    time.sleep(0.5)  # имитация сетевого запроса
    return n * n


start = time.perf_counter()
with ThreadPoolExecutor(max_workers=5) as pool:
    print(list(pool.map(slow_square, range(5))))
print(f"{time.perf_counter() - start:.1f} с")
0 привет из дочернего процесса
[0, 1, 4, 9, 16]
0.5 с

Пять задач по полсекунды выполнились за 0,5 секунды вместо 2,5. Код с ProcessPoolExecutor и multiprocessing в Windows и macOS размещайте под if __name__ == "__main__": — дочерние процессы заново импортируют главный модуль.

Сеть и интернет: urllib, http.server, smtplib

urllib.parse разбирает и собирает адреса, urllib.request.urlopen() выполняет HTTP-запрос, smtplib и email отправляют письма, socket работает с TCP и UDP напрямую.

import json
from urllib.parse import urlencode, urlparse
from urllib.request import urlopen

url = "https://pypi.org/pypi/requests/json"
parts = urlparse(url)
print(parts.scheme, parts.netloc, parts.path)
print(urlencode({"q": "python", "page": 2}))

with urlopen(url, timeout=10) as response:
    data = json.load(response)
print(response.status, data["info"]["name"])
https pypi.org /pypi/requests/json
q=python&page=2
200 requests

Для разового запроса urllib хватает. Для сессий, авторизации, повторных попыток и удобной отправки форм и файлов берут сторонний пакет — как это выглядит, показано в статье про библиотеку requests. Модуль http.server подходит только для локальной разработки: в продакшне он небезопасен.

Отладка, логирование и тестирование

  • logging — журнал с уровнями (DEBUG, INFO, WARNING, ERROR), выводом в консоль или файл; логгер получают через logging.getLogger(__name__);
  • pdb — пошаговый отладчик; точку останова ставит встроенная функция breakpoint();
  • traceback — форматирование стека ошибки в строку;
  • timeit — замер скорости маленьких фрагментов, cProfile — профилирование всей программы;
  • unittest и unittest.mock — тесты и подмена зависимостей, doctest — проверка примеров в docstring.
import logging

logging.basicConfig(level=logging.INFO, format="%(levelname)s %(name)s: %(message)s")
log = logging.getLogger("billing")

log.debug("не попадёт в вывод: уровень ниже INFO")
log.info("Счёт %s оплачен", "A-17")
INFO billing: Счёт A-17 оплачен

Параметры передавайте через %s, а не f-строкой: при отключённом уровне строка не форматируется вовсе. Внутри except вызывайте log.exception() — он запишет сообщение с уровнем ERROR и полный traceback.

Тест на unittest — класс с методами test_*:

import unittest


def apply_discount(price: float, percent: float) -> float:
    return round(price * (1 - percent / 100), 2)


class ApplyDiscountTest(unittest.TestCase):
    def test_ten_percent(self):
        self.assertEqual(apply_discount(1000, 10), 900.0)

    def test_zero_percent(self):
        self.assertEqual(apply_discount(1000, 0), 1000.0)


if __name__ == "__main__":
    unittest.main()
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

unittest встроен в Python и лежит в основе тестов Django. В новых проектах чаще выбирают сторонний pytest: он запускает и тесты unittest, а свои пишутся обычными функциями с assert.

Командная строка: argparse и готовые утилиты python -m

argparse разбирает аргументы скрипта, проверяет типы и сам генерирует справку по --help. Для пароля без отображения на экране есть getpass.getpass().

import argparse

parser = argparse.ArgumentParser(description="Переименовать файлы в папке")
parser.add_argument("folder", help="папка с файлами")
parser.add_argument("--ext", default=".txt", help="расширение файлов")
parser.add_argument("--dry-run", action="store_true", help="только показать изменения")

args = parser.parse_args(["photos", "--ext", ".jpg", "--dry-run"])
print(args)
Namespace(folder='photos', ext='.jpg', dry_run=True)

В реальном скрипте вызывайте parser.parse_args() без аргументов — он прочитает sys.argv. Список в примере нужен, чтобы код запускался без командной строки.

Многие модули стандартной библиотеки работают как готовые консольные программы. В Windows запускайте их через python -m, в macOS и Linux — через python3 -m:

python -m http.server 8000                    # раздать текущую папку по http://localhost:8000
python -m json.tool --no-ensure-ascii data.json  # отформатировать JSON
python -m venv .venv                          # создать виртуальное окружение
python3 -m http.server 8000
python3 -m json.tool --no-ensure-ascii data.json
python3 -m venv .venv
КомандаЧто делаетВерсия
python -m http.serverСтатический веб-сервер для текущей папки3.x
python -m json.tool file.jsonПроверка и форматирование JSON3.x
python -m venv .venvВиртуальное окружение3.3+
python -m zipfile -l a.zipСписок файлов в архиве; -e распаковывает3.x
python -m timeit "выражение"Замер скорости выражения3.x
python -m calendar 2026 10Календарь на месяц3.x
python -m cProfile script.pyПрофиль: сколько времени заняла каждая функция3.x
python -m pdb script.pyЗапуск скрипта под отладчиком3.x
python -m sqlite3 base.dbКонсоль SQLite3.12+
python -m uuidНовый UUID3.12+
python -m random 6Случайное число от 1 до 63.13+
python -m profiling.samplingПрофилировщик Tachyon, подключается к процессу3.15+

Что удалено из стандартной библиотеки

Стандартная библиотека не только растёт. По PEP 594 («dead batteries» — «севшие батарейки») из неё убрали устаревшие и небезопасные модули: часть исчезла в Python 3.12, оставшиеся 19 — в 3.13. Старый код с таким импортом на новой версии упадёт с ModuleNotFoundError.

МодульУдалён вЧем заменить
distutils3.12setuptools, sysconfig
asyncore, asynchat3.12asyncio
smtpd3.12aiosmtpd из PyPI
imp3.12importlib
cgi, cgitb3.13urllib.parse.parse_qs(), email.message, веб-фреймворк
crypt3.13hashlib; для паролей — bcrypt или argon2-cffi
imghdr, sndhdr3.13filetype, puremagic
pipes3.13subprocess, shlex.quote()
telnetlib3.13telnetlib3
uu3.13base64
mailcap3.13mimetypes
nntplib3.13pynntp
spwd3.13python-pam
aifc, audioop, chunk, sunau, xdrlib, msilib, nis, ossaudiodev3.13пакеты standard-* или аналоги из PyPI
lib2to3 и утилита 2to3, tkinter.tix3.13—
sre_compile, sre_constants, sre_parse3.15re

Для большинства удалённых модулей на PyPI есть копии с префиксом standard-: pip install standard-telnetlib вернёт прежний import telnetlib. Это временная мера на период переноса — новые проекты пишите на заменах из таблицы. В Python 3.15 устаревшим объявлен модуль profile: его удалят в 3.17, профилировать стоит через cProfile или новый пакет profiling.

Что нового в Python 3.14 и 3.15

Python 3.14 (октябрь 2025):

  • compression.zstd — сжатие Zstandard; модули gzip, bz2, lzma и zlib теперь доступны и в пакете compression;
  • string.templatelib и t-строки t"..." — шаблоны, которые библиотека может обработать до подстановки, например экранировать HTML или SQL;
  • annotationlib — чтение аннотаций типов, которые теперь вычисляются отложенно;
  • concurrent.interpreters — несколько интерпретаторов в одном процессе;
  • uuid.uuid7() — UUID, упорядоченные по времени создания, удобные как ключи в базе данных;
  • Path.copy(), Path.move() и их варианты copy_into(), move_into() — копирование и перенос папок без shutil;
  • heapq.heapify_max() и heappop_max() — куча с максимумом наверху;
  • python -m asyncio ps PID и pstree PID — список задач asyncio в работающем процессе.
# Python 3.14+
import uuid
from compression import zstd

print(uuid.uuid7().version)                         # → 7
packed = zstd.compress(("строка " * 1000).encode())
print(len(packed))                                  # → 31 (из 13 000 байт)

Python 3.15 (вышел 9 октября 2026 года):

  • UTF-8 стала кодировкой по умолчанию для open() и других операций ввода-вывода без аргумента encoding; прежнее поведение возвращает -X utf8=0 или PYTHONUTF8=0;
  • ленивые импорты: lazy import json откладывает загрузку модуля до первого обращения и ускоряет запуск больших программ;
  • встроенный тип frozendict — неизменяемый словарь, который можно использовать как ключ или хранить в множестве;
  • пакет profiling: profiling.tracing (бывший cProfile, который остаётся псевдонимом) и profiling.sampling — профилировщик Tachyon, подключается к работающему процессу по PID;
  • новый модуль math.integer с функциями для целых чисел: isqrt, gcd, lcm, comb, perm, factorial;
  • re.prefixmatch() — новое имя для re.match(), чтобы его не путали с re.search();
  • json.loads() получил параметр array_hook, collections.Counter — операцию ^ (симметрическая разность), tomllib читает TOML 1.1.
# Python 3.15+
lazy import json
import re

config = frozendict(host="localhost", port=8000)
print(config)                                       # → frozendict({'host': 'localhost', 'port': 8000})
print(re.prefixmatch(r"\d+", "123abc").group())     # → 123
print(json.loads("[1, [2, 3]]", array_hook=tuple))  # → (1, (2, 3))

Полный перечень изменений — в разделе What’s New in Python 3.15 официальной документации.

Частые вопросы

Почему import random выдаёт AttributeError?

Скорее всего, рядом со скриптом лежит ваш файл random.py, json.py или email.py. Python находит его раньше модуля стандартной библиотеки и импортирует вместо него. Переименуйте свой файл и удалите папку __pycache__ рядом с ним. Начиная с Python 3.13 сообщение об ошибке прямо подсказывает, какой файл мешает.

Можно ли посмотреть исходный код модуля?

Да. Модули на чистом Python лежат в папке Lib установки, путь показывает атрибут __file__: import json; print(json.__file__). Функция inspect.getsource() выводит исходник конкретной функции или класса. У модулей на C, например math, исходник на Python отсутствует — их код есть в репозитории CPython.

Почему в Linux нет venv или tkinter, хотя они входят в стандартную библиотеку?

Debian, Ubuntu и производные дистрибутивы выносят части стандартной библиотеки в отдельные системные пакеты. Установите их менеджером пакетов: sudo apt install python3-venv python3-tk. В сборках с python.org для Windows и macOS такого разделения нет.

Есть ли документация стандартной библиотеки на русском?

На docs.python.org/ru/3/ переведены учебник, глоссарий и описание встроенных функций, а справочник по модулям пока в основном на английском. Где найти переводы и как ими пользоваться, рассказано в статье про документацию Python на русском. Встроенная справка работает без интернета: help(json) в интерактивной консоли или python -m pydoc json в терминале.

Нужно ли учить всю стандартную библиотеку?

Нет. Освойте модули из примеров выше — они встречаются почти в каждом проекте. Остальные достаточно знать по названию: перед тем как писать свою функцию или ставить пакет, проверьте таблицу «задача → модуль» или указатель модулей в документации.

Итог

  • Стандартная библиотека Python ставится вместе с интерпретатором и подключается через import без pip.
  • Базовый набор: pathlib, shutil, datetime, zoneinfo, re, json, csv, sqlite3, collections, itertools, functools, math, random, secrets, subprocess, concurrent.futures, logging, unittest, argparse.
  • Сторонний пакет нужен, когда возможностей модуля не хватает: requests вместо urllib для сложного HTTP, pytest вместо unittest, pandas вместо csv для анализа таблиц.
  • Python 3.13 удалил 19 устаревших модулей по PEP 594 — старый код с cgi, telnetlib или imghdr требует замены.
  • Python 3.15 сделал UTF-8 кодировкой по умолчанию и добавил ленивые импорты, frozendict и профилировщик Tachyon; явный encoding="utf-8" по-прежнему лучший выбор для переносимого кода.
  • #Python
  • #Стандартная библиотека
  • #Модули
  • #pathlib
  • #collections
↑ ↓ выборEnter открытьEsc закрыть