🔖 Справочник команд и синтаксиса

⚡ Краткий справочник

  • sys.argv — список аргументов командной строки.
  • os.path.join(dir, year, month, filename) — собрать путь кроссплатформенно.
  • os.makedirs(path, exist_ok=True) — создать папки, не падая, если они уже есть.
  • defaultdict(list) и defaultdict(lambda: defaultdict(int)) — автоинициализация словарей.
  • sorted(records, key=lambda x: x["date"]) — сортировка по ключу.
  • with open(file, "w", encoding="utf-8") as f: — безопасная запись в файл.

Аргументы командной строки: sys.argv

sys.argv — это список строк, содержащий имя скрипта и все аргументы, переданные при запуске.

Командаsys.argv
python sales_report.py data/sales_data.txt reports ["sales_report.py", "data/sales_data.txt", "reports"]

Проверка количества аргументов:

import sys

if len(sys.argv) < 3:
    print("Usage: python sales_report.py <input_file> <output_directory>")
    sys.exit(1)

input_file = sys.argv[1]
output_directory = sys.argv[2]

Работа с путями: os.path.join

Функция склеивает части пути с правильным разделителем для текущей ОС.

import os

report_file = os.path.join("reports", "2025", "02", "monthly_report.txt")
# Windows: reports\2025\02\monthly_report.txt
# Linux/Mac: reports/2025/02/monthly_report.txt

Создание папок: os.makedirs

Создаёт все промежуточные папки на пути. Параметр exist_ok=True отключает ошибку, если папка уже существует.

import os

os.makedirs("reports/2025/02", exist_ok=True)

В решении обычно создаётся папка для конечного файла:

os.makedirs(os.path.dirname(category_file), exist_ok=True)

Группировка: collections.defaultdict

defaultdict принимает фабрику значений по умолчанию. При обращении к отсутствующему ключу он создаёт значение автоматически.

Список по умолчанию

from collections import defaultdict

records_by_category = defaultdict(list)
records_by_category["Electronics"].append({"date": "2025-02-01", "amount": 100})
# ключ "Electronics" создаётся автоматически

Вложенный defaultdict

Для сумм по категориям используется вложенная структура:

category_totals = defaultdict(lambda: defaultdict(int))
category_totals[("2025", "02")]["Electronics"] += 100

Сортировка: sorted и lambda

Функция sorted возвращает новый отсортированный список, не изменяя исходный.

records = [
    {"date": "2025-02-02", "name": "Alice", "amount": 300},
    {"date": "2025-02-01", "name": "Bob", "amount": 200},
]

sorted_records = sorted(records, key=lambda x: x["date"])

Записи с одинаковой датой сохранят исходный порядок, потому что sorted в Python стабильна.

Запись в файл

Всегда указывайте кодировку utf-8 при работе с текстовыми файлами. Менеджер контекста with гарантирует закрытие файла.

with open(report_file, "w", encoding="utf-8") as file:
    for category, total in sorted(category_sums.items()):
        file.write(f"{category},{total}\n")
    file.write(f"Full,{sum(category_sums.values())}\n")

Частые паттерны

# 1. Чтение файла построчно
with open(input_file, "r", encoding="utf-8") as file:
    for line in file:
        parts = line.strip().split(",")

# 2. Проверка количества полей
if len(parts) == 5:
    name, date, amount, category, city = parts

# 3. Извлечение года и месяца
year, month, day = date.split("-")

# 4. Группировка записей
grouped_sales = defaultdict(list)
grouped_sales[(year, month, category)].append(record)

# 5. Группировка сумм
category_totals = defaultdict(lambda: defaultdict(int))
category_totals[(year, month)][category] += int(amount)

# 6. Кроссплатформенный путь и создание папок
file_path = os.path.join(output_dir, year, month, f"{category}.txt")
os.makedirs(os.path.dirname(file_path), exist_ok=True)