Python 3 стандартная библиотека: практическое руководство

Раздел: Библиотеки -> Общие вопросы по библиотекам

Стандартная библиотека Python 3 включает множество встроенных модулей для решения разнообразных задач. В этой статье рассмотрены наиболее полезные из них с примерами кода.

Обзор ключевых модулей

Как создать каталог и записать файл?

Модуль pathlib предоставляет объектно-ориентированный интерфейс для работы с путями. Это современный и рекомендуемый способ.

from pathlib import Path

path = Path("data/new_folder")
path.mkdir(parents=True, exist_ok=True)
file_path = path / "example.txt"
file_path.write_text("Hello, world!")

Python 3 стандартная библиотека (стандартная библиотека python 3)

Пояснение: parents=True создает все родительские каталоги, exist_ok=True не вызывает ошибку при существовании.

Ошибки: FileNotFoundError при отсутствии parents=True. Также при записи через write_text кодировка по умолчанию UTF-8; для других кодировок укажите encoding.

Альтернатива: os.path и os.makedirs

import os

dir_path = "data/new_folder"
os.makedirs(dir_path, exist_ok=True)
file_path = os.path.join(dir_path, "example.txt")
with open(file_path, "w", encoding="utf-8") as f:
    f.write("Hello, world!")

Python онлайн с библиотеками (работа с python онлайн с использованием библиотек)

Более старый подход, требует явного создания пути через os.path.join. Код менее читаем.

Проблемы: os.path.join может вести себя по-разному на разных ОС при смешивании абсолютных и относительных путей.

Как сериализовать данные для обмена?

Модуль json - стандартный способ сериализации в формат JSON.

import json

data = {"name": "Alice", "age": 30, "hobbies": ["reading", "cycling"]}
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f)

with open("data.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)
print(loaded)
{'name': 'Alice', 'age': 30, 'hobbies': ['reading', 'cycling']}

Пояснение: json.dump записывает, json.load читает. Параметр ensure_ascii=False позволяет сохранить нелатинские символы.

Типичная ошибка: TypeError при сериализации нестандартных типов (например, datetime). Решение - использовать default или собственный сериализатор.

Альтернатива: pickle для любых объектов

import pickle

obj = {"key": [1, 2, 3], "func": lambda x: x+1}
with open("data.pkl", "wb") as f:
    pickle.dump(obj, f)

with open("data.pkl", "rb") as f:
    loaded = pickle.load(f)
print(loaded)

pickle может сериализовать почти любой объект Python, но небезопасен для данных из ненадежных источников.

Предупреждение: загрузка данных pickle из непроверенного источника может привести к выполнению произвольного кода.

Как подсчитать повторяющиеся элементы?

Модуль collections предоставляет Counter для автоматического подсчета.

from collections import Counter

fruits = ["apple", "banana", "apple", "orange", "banana", "apple"]
counter = Counter(fruits)
print(counter)
print(counter.most_common(2))
Counter({'apple': 3, 'banana': 2, 'orange': 1})
[('apple', 3), ('banana', 2)]

Counter - подкласс dict, обладает всеми его методами.

Ошибки: попытка использовать Counter для нехэшируемых элементов (списков) вызовет TypeError.

Ручной подсчет с помощью обычного словаря

fruits = ["apple", "banana", "apple", "orange", "banana", "apple"]
count = {}
for fruit in fruits:
    if fruit in count:
        count[fruit] += 1
    else:
        count[fruit] = 1
print(count)

Более многословный подход, подверженный ошибкам (забытая инициализация).

Продвинутые примеры использования

Комбинаторика и группировка с itertools

Пример
import itertools

# декартово произведение
suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
ranks = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
deck = list(itertools.product(ranks, suits))
print(len(deck), deck[:5])

# группировка по ключу
data = [('A', 1), ('B', 2), ('A', 3), ('B', 4)]
data_sorted = sorted(data, key=lambda x: x[0])
groups = {k: list(g) for k, g in itertools.groupby(data_sorted, key=lambda x: x[0])}
print(groups)
52 [('2', 'Hearts'), ('2', 'Diamonds'), ('2', 'Clubs'), ('2', 'Spades'), ('3', 'Hearts')]
{'A': [('A', 1), ('A', 3)], 'B': [('B', 2), ('B', 4)]}

product порождает все комбинации, groupby требует предварительной сортировки.

Мемоизация с functools.lru_cache

Пример
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(50))
print(fibonacci.cache_info())
12586269025
CacheInfo(hits=48, misses=51, maxsize=None, currsize=51)

Кэширование результатов ускоряет рекурсивные вычисления. cache_info() показывает статистику.

Обработка аргументов командной строки с argparse

Пример
import argparse

parser = argparse.ArgumentParser(description='Пример парсера')
parser.add_argument('--name', required=True, help='Имя')
parser.add_argument('--count', type=int, default=1, help='Количество')
args = parser.parse_args(['--name', 'Alice', '--count', '3'])

for _ in range(args.count):
    print(f'Hello, {args.name}!')
Hello, Alice!
Hello, Alice!
Hello, Alice!

argparse автоматически генерирует справку и проверяет типы.

Безопасный запуск внешних команд с subprocess

Пример
import subprocess

# правильный способ: список аргументов
result = subprocess.run(['echo', 'Hello'], capture_output=True, text=True)
print('stdout:', result.stdout)

# пример с ошибкой: shell=True (не рекомендуется)
# result = subprocess.run('echo Hello', shell=True)
stdout: Hello

Использование списка аргументов (shell=False) предотвращает инъекции команд.

Стандартная библиотека Python 3 - comments

En
Python 3 стандартная библиотека (python)