Стандартная библиотека Python: самые полезные модули
Стандартная библиотека Python по задачам: файлы, даты, JSON и CSV, регулярные выражения, коллекции, процессы, сеть, тесты. Что удалено в 3.13 и нового в 3.15.
Содержание · 16 разделов
- Что входит в стандартную библиотеку
- Таблица: задача → модуль
- Файлы и пути: pathlib, shutil, tempfile
- Даты и время: datetime, zoneinfo, time
- Текст и регулярные выражения: re, textwrap, difflib
- Данные и форматы: json, csv, sqlite3, tomllib
- Коллекции и итераторы: collections, itertools, functools
- Математика и случайность: math, statistics, decimal, random, secrets
- Процессы и параллельность: subprocess, concurrent.futures, asyncio
- Сеть и интернет: urllib, http.server, smtplib
- Отладка, логирование и тестирование
- Командная строка: argparse и готовые утилиты python -m
- Что удалено из стандартной библиотеки
- Что нового в Python 3.14 и 3.15
- Частые вопросы
- Почему import random выдаёт AttributeError?
- Можно ли посмотреть исходный код модуля?
- Почему в Linux нет venv или tkinter, хотя они входят в стандартную библиотеку?
- Есть ли документация стандартной библиотеки на русском?
- Нужно ли учить всю стандартную библиотеку?
- Итог
Стандартная библиотека 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, shelve | PostgreSQL и 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-запросы и URL | urllib.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 | Проверка и форматирование JSON | 3.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 | Консоль SQLite | 3.12+ |
python -m uuid | Новый UUID | 3.12+ |
python -m random 6 | Случайное число от 1 до 6 | 3.13+ |
python -m profiling.sampling | Профилировщик Tachyon, подключается к процессу | 3.15+ |
Что удалено из стандартной библиотеки
Стандартная библиотека не только растёт. По PEP 594 («dead batteries» — «севшие батарейки») из неё убрали устаревшие и небезопасные модули: часть исчезла в Python 3.12, оставшиеся 19 — в 3.13. Старый код с таким импортом на новой версии упадёт с ModuleNotFoundError.
| Модуль | Удалён в | Чем заменить |
|---|---|---|
distutils | 3.12 | setuptools, sysconfig |
asyncore, asynchat | 3.12 | asyncio |
smtpd | 3.12 | aiosmtpd из PyPI |
imp | 3.12 | importlib |
cgi, cgitb | 3.13 | urllib.parse.parse_qs(), email.message, веб-фреймворк |
crypt | 3.13 | hashlib; для паролей — bcrypt или argon2-cffi |
imghdr, sndhdr | 3.13 | filetype, puremagic |
pipes | 3.13 | subprocess, shlex.quote() |
telnetlib | 3.13 | telnetlib3 |
uu | 3.13 | base64 |
mailcap | 3.13 | mimetypes |
nntplib | 3.13 | pynntp |
spwd | 3.13 | python-pam |
aifc, audioop, chunk, sunau, xdrlib, msilib, nis, ossaudiodev | 3.13 | пакеты standard-* или аналоги из PyPI |
lib2to3 и утилита 2to3, tkinter.tix | 3.13 | — |
sre_compile, sre_constants, sre_parse | 3.15 | re |
Для большинства удалённых модулей на 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