Стандартная библиотека Python - это набор модулей и пакетов, которые поставляются вместе с интерпретатором Python. Она предоставляет широкий спектр функциональности "из коробки", включая работу с файлами, сетью, датами, регулярными выражениями, математическими операциями и многое другое. Стандартная библиотека часто называется "батарейками в комплекте", что отражает философию Python о предоставлении обширной функциональности без необходимости устанавливать дополнительные пакеты.
Модули для работы с файловой системой позволяют выполнять операции с файлами и каталогами:
from pathlib import Path
import os
# Работа с путями с помощью pathlib (современный подход)
путь = Path("пример_каталога") / "подкаталог" / "файл.txt"
print(f"Путь: {путь}")
print(f"Родительский каталог: {путь.parent}")
print(f"Имя файла: {путь.name}")
print(f"Расширение: {путь.suffix}")
# Создание каталогов
if not путь.parent.exists():
путь.parent.mkdir(parents=True, exist_ok=True)
print(f"Каталог {путь.parent} создан")
# Работа с os.path (классический подход)
классический_путь = os.path.join("пример_каталога", "подкаталог", "файл.txt")
print(f"Классический путь: {классический_путь}")
print(f"Абсолютный путь: {os.path.abspath(классический_путь)}")
print(f"Существует ли файл: {os.path.exists(классический_путь)}")
# Получение информации о файле
if os.path.exists(__file__): # __file__ - путь к текущему файлу
статистика = os.stat(__file__)
print(f"Размер файла: {статистика.st_size} байт")
print(f"Время последнего изменения: {статистика.st_mtime}")
# Работа с текущим рабочим каталогом
print(f"Текущий каталог: {os.getcwd()}")
print(f"Список файлов в текущем каталоге: {os.listdir('.')}")
Модули datetime и time предоставляют инструменты для работы с датами и временем:
from datetime import datetime, date, time, timedelta
import time as time_module # Переименовываем для избежания конфликта имен
# Работа с текущей датой и временем
сейчас = datetime.now()
print(f"Текущая дата и время: {сейчас}")
print(f"Текущая дата: {сейчас.date()}")
print(f"Текущее время: {сейчас.time()}")
# Создание конкретных дат и времени
день_рождения = datetime(1990, 5, 15, 14, 30)
print(f"День рождения: {день_рождения}")
# Форматирование дат
print(f"Отформатированная дата: {сейчас.strftime('%d.%m.%Y %H:%M:%S')}")
print(f"День недели: {сейчас.strftime('%A')}")
# Разбор строк в даты
строка_даты = "2023-12-25 15:30:00"
дата_из_строки = datetime.strptime(строка_даты, '%Y-%m-%d %H:%M:%S')
print(f"Дата из строки: {дата_из_строки}")
# Арифметика с датами
через_неделю = сейчас + timedelta(weeks=1)
через_месяц = сейчас + timedelta(days=30)
print(f"Через неделю: {через_неделю}")
print(f"Через 30 дней: {через_месяц}")
# Разница между датами
разница = через_месяц - сейчас
print(f"Разница: {разница.days} дней")
# Работа с time
print("Засыпаем на 2 секунды...")
time_module.sleep(2) # Пауза на 2 секунды
print("Проснулись!")
# Получение времени в Unix формате
unix_время = time_module.time()
print(f"Unix время: {unix_время}")
print(f"Преобразованное время: {datetime.fromtimestamp(unix_время)}")
Модуль re предоставляет мощные инструменты для работы с регулярными выражениями:
import re
# Поиск совпадений
текст = "Контакты: email@example.com, телефон: +7(123)456-78-90, сайт: https://example.com"
# Поиск email адресов
email_паттерн = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
email_адреса = re.findall(email_паттерн, текст)
print(f"Найденные email адреса: {email_адреса}")
# Поиск телефонных номеров
телефон_паттерн = r'\+7\(\d{3}\)\d{3}-\d{2}-\d{2}'
телефоны = re.findall(телефон_паттерн, текст)
print(f"Найденные телефоны: {телефоны}")
# Поиск URL
url_паттерн = r'https?://[^\s]+'"
url_адреса = re.findall(url_паттерн, текст)
print(f"Найденные URL: {url_адреса}")
# Замена текста
новый_текст = re.sub(email_паттерн, "[EMAIL СКРЫТ]", текст)
print(f"Текст после замены email: {новый_текст}")
# Использование объектов паттернов для многократного использования
email_объект = re.compile(email_паттерн)
if email_объект.search(текст):
print("В тексте найден email адрес")
# Разделение строки по паттерну
предложения = re.split(r'[.!?]+ ', "Привет! Как дела? Все хорошо. Отлично!")
print(f"Разделенные предложения: {предложения}")
# Проверка соответствия строки паттерну
валидация_email = lambda email: bool(re.match(email_паттерн, email))
print(f"Валидный email 'test@example.com': {валидация_email('test@example.com')}")
print(f"Валидный email 'invalid.email': {валидация_email('invalid.email')}")
Модуль collections предоставляет дополнительные типы данных и структуры:
from collections import Counter, defaultdict, namedtuple, deque
import random
# Counter - подсчет элементов
текст = "программирование на python это замечательно"
счетчик_букв = Counter(текст)
print(f"Частота букв: {счетчик_букв}")
print(f"Наиболее частые буквы: {счетчик_букв.most_common(3)}")
# defaultdict - словарь с значением по умолчанию
оценки = defaultdict(list)
оценки["Иван"].append(5)
оценки["Мария"].append(4)
оценки["Иван"].append(3)
print(f"Оценки: {dict(оценки)}")
# namedtuple - именованный кортеж
Точка = namedtuple('Точка', ['x', 'y'])
точка1 = Точка(1, 2)
точка2 = Точка(3, 4)
print(f"Точка 1: x={точка1.x}, y={точка1.y}")
print(f"Точка 2: {точка2}")
# deque - двусторонняя очередь
очередь = deque([1, 2, 3])
очередь.append(4) # Добавить справа
очередь.appendleft(0) # Добавить слева
print(f"Очередь после добавления: {очередь}")
элемент_справа = очередь.pop() # Удалить справа
элемент_слева = очередь.popleft() # Удалить слева
print(f"Удаленные элементы: {элемент_справа}, {элемент_слева}")
print(f"Очередь после удаления: {очередь}")
# Ограниченная очередь
ограниченная_очередь = deque(maxlen=3)
for i in range(5):
ограниченная_очередь.append(i)
print(f"Ограниченная очередь: {ограниченная_очередь}")
Модуль json позволяет работать с данными в формате JSON:
import json
# Преобразование Python объектов в JSON
данные = {
"имя": "Анна",
"возраст": 25,
"хобби": ["программирование", "чтение", "путешествия"],
"адрес": {
"город": "Москва",
"улица": "Арбат"
}
}
# Преобразование в строку JSON
json_строка = json.dumps(данные, ensure_ascii=False, indent=2)
print("Данные в формате JSON:")
print(json_строка)
# Запись в файл
with open("данные.json", "w", encoding="utf-8") as файл:
json.dump(данные, файл, ensure_ascii=False, indent=2)
# Чтение из файла
with open("данные.json", "r", encoding="utf-8") as файл:
прочитанные_данные = json.load(файл)
print(f"Прочитанные данные: {прочитанные_данные}")
# Преобразование JSON строки в Python объект
json_строка = '{"имя": "Иван", "возраст": 30, "хобби": ["спорт", "музыка"]}'
объект = json.loads(json_строка)
print(f"Python объект: {объект}")
print(f"Имя: {объект['имя']}")
# Работа с пользовательскими классами
class Персона:
def __init__(self, имя, возраст):
self.имя = имя
self.возраст = возраст
# Для сериализации пользовательских классов нужно создать функцию кодирования
def кодировать_персону(объект):
if isinstance(объект, Персона):
return {"имя": объект.имя, "возраст": объект.возраст}
raise TypeError(f"Объект типа {type(объект)} не сериализуем")
персона = Персона("Мария", 28)
json_персона = json.dumps(персона, default=кодировать_персону, ensure_ascii=False)
print(f"Персона в JSON: {json_персона}")
Модули math и random предоставляют математические функции и генерацию случайных чисел:
import math
import random
# Математические функции
print(f"Квадратный корень из 16: {math.sqrt(16)}")
print(f"2 в степени 8: {math.pow(2, 8)}")
print(f"Пи: {math.pi}")
print(f"Синус 90 градусов: {math.sin(math.radians(90))}")
print(f"Логарифм 100 по основанию 10: {math.log10(100)}")
print(f"Округление вверх 4.2: {math.ceil(4.2)}")
print(f"Округление вниз 4.8: {math.floor(4.8)}")
# Генерация случайных чисел
print(f"Случайное число от 1 до 10: {random.randint(1, 10)}")
print(f"Случайное вещественное число от 0 до 1: {random.random()}")
print(f"Случайный выбор из списка: {random.choice(['яблоко', 'банан', 'апельсин'])}")
# Перемешивание списка
список_карт = ["Туз", "Король", "Дама", "Валет", "10"]
print(f"Исходный список: {список_карт}")
random.shuffle(список_карт)
print(f"Перемешанный список: {список_карт}")
# Генерация случайной выборки
алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
случайные_буквы = random.sample(алфавит, 5)
print(f"Случайные буквы: {случайные_буквы}")
# Установка начального значения для воспроизводимости
random.seed(42)
print(f"Случайное число с seed=42: {random.randint(1, 100)}")
random.seed(42)
print(f"То же число с seed=42: {random.randint(1, 100)}")
Создайте функцию, которая принимает путь к каталогу и возвращает словарь с информацией о файлах в этом каталоге: количество файлов, общий размер, список файлов с расширениями.
from pathlib import Path
def информация_о_каталоге(путь_к_каталогу):
каталог = Path(путь_к_каталогу)
if not каталог.exists():
raise FileNotFoundError(f"Каталог {путь_к_каталогу} не существует")
if not каталог.is_dir():
raise ValueError(f"{путь_к_каталогу} не является каталогом")
файлы = list(каталог.iterdir())
файлы_только = [файл for файл in файлы if файл.is_file()]
общий_размер = sum(файл.stat().st_size for файл in файлы_только)
расширения = {}
for файл in файлы_только:
расширение = файл.suffix.lower()
if расширение in расширения:
расширения[расширение] += 1
else:
расширения[расширение] = 1
return {
"количество_файлов": len(файлы_только),
"общий_размер": общий_размер,
"файлы": [файл.name for файл in файлы_только],
"расширения": расширения
}
# Тестирование
try:
информация = информация_о_каталоге(".") # Текущий каталог
print(f"Количество файлов: {информация['количество_файлов']}")
print(f"Общий размер: {информация['общий_размер']} байт")
print(f"Расширения: {информация['расширения']}")
except (FileNotFoundError, ValueError) as e:
print(f"Ошибка: {e}")
Создайте функцию, которая проверяет список email адресов с помощью регулярных выражений и возвращает только валидные адреса.
import re
def валидация_email_адресов(список_адресов):
паттерн = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
компилированный_паттерн = re.compile(паттерн)
валидные_адреса = []
for адрес in список_адресов:
if компилированный_паттерн.match(адрес):
валидные_адреса.append(адрес)
return валидные_адреса
# Тестирование
email_адреса = [
"valid@example.com",
"invalid.email",
"test@domain.co.uk",
"@invalid.com",
"user.name@company.org",
"invalid@",
"valid123@test-domain.com"
]
валидные = валидация_email_адресов(email_адреса)
print(f"Валидные email адреса: {валидные}")
Создайте функцию, которая анализирует текст и возвращает статистику: количество слов, предложений, самых частых слов и среднюю длину слова.
import re
from collections import Counter
def анализ_текста(текст):
# Очистка текста от лишних символов
очищенный_текст = re.sub(r'[^\w\s]', ' ', текст)
# Разделение на слова
слова = [слово.lower() for слово in очищенный_текст.split() if слово]
# Подсчет слов
количество_слов = len(слова)
# Подсчет предложений
предложения = re.split(r'[.!?]+ ', текст)
количество_предложений = len([п for п in предложения if п.strip()])
# Самые частые слова
счетчик_слов = Counter(слова)
самые_частые = счетчик_слов.most_common(5)
# Средняя длина слова
общая_длина = sum(len(слово) for слово in слова)
средняя_длина = общая_длина / количество_слов if количество_слов > 0 else 0
return {
"количество_слов": количество_слов,
"количество_предложений": количество_предложений,
"самые_частые_слова": самые_частые,
"средняя_длина_слова": round(средняя_длина, 2)
}
# Тестирование
пример_текста = """Python - это мощный язык программирования.
Он прост в изучении и имеет читаемый синтаксис.
Python используется для веб-разработки, анализа данных и машинного обучения.
Многие компании выбирают Python для своих проектов.
Python имеет богатую экосистему библиотек и фреймворков."""
статистика = анализ_текста(пример_текста)
print(f"Количество слов: {статистика['количество_слов']}")
print(f"Количество предложений: {статистика['количество_предложений']}")
print(f"Самые частые слова: {статистика['самые_частые_слова']}")
print(f"Средняя длина слова: {статистика['средняя_длина_слова']} символа")