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) предотвращает инъекции команд.