Аргументы командной строки: 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)