🐛 Типичные ошибки

⚡ Топ-3 ошибки

  • Не проверять количество аргументов sys.argv перед их использованием.
  • Склеивать пути вручную через "\\" или "/" вместо os.path.join.
  • Забывать exist_ok=True в os.makedirs и получать FileExistsError.

❌ Ошибка 1. Неправильная работа с sys.argv

# Неправильно
import sys

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

Почему плохо: если пользователь забыл передать аргументы, программа упадёт с IndexError вместо понятного сообщения.

✅ Исправление

# Правильно
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]

❌ Ошибка 2. Ручное склеивание путей

# Неправильно
path = output_dir + "\\" + year + "\\" + month + "\\monthly_report.txt"
# или
path = f"{output_dir}/{year}/{month}/monthly_report.txt"

Почему плохо: код с "\\" не работает на Linux и macOS. Ручной / работает на Unix, но ведёт себя иначе на Windows при некоторых операциях.

✅ Исправление

# Правильно
import os

path = os.path.join(output_dir, year, month, "monthly_report.txt")

❌ Ошибка 3. Забыли exist_ok=True

# Неправильно
import os

os.makedirs(os.path.dirname(category_file))

Почему плохо: при повторном запуске программы папка уже существует, и os.makedirs выбросит FileExistsError.

✅ Исправление

# Правильно
os.makedirs(os.path.dirname(category_file), exist_ok=True)

❌ Ошибка 4. Изменение словаря во время итерации

# Неправильно
for key in grouped_sales:
    if len(grouped_sales[key]) == 0:
        del grouped_sales[key]

Почему плохо: удаление элементов из словаря во время цикла for по нему приводит к RuntimeError.

✅ Исправление

# Правильно: создать список ключей для удаления
keys_to_remove = [key for key, value in grouped_sales.items() if len(value) == 0]
for key in keys_to_remove:
    del grouped_sales[key]

❌ Ошибка 5. Отсутствие кодировки при открытии файла

# Неправильно
with open(file_path, "r") as file:
    data = file.read()

Почему плохо: на разных системах по умолчанию может использоваться разная кодировка. Если в файле есть кириллица или спецсимволы, программа упадёт с UnicodeDecodeError.

✅ Исправление

# Правильно
with open(file_path, "r", encoding="utf-8") as file:
    data = file.read()

❌ Ошибка 6. Не проверять количество полей после split

# Неправильно
for line in file:
    name, date, amount, category, city = line.strip().split(",")

Почему плохо: пустая строка или строка с лишней запятой вызовет ValueError: not enough values to unpack.

✅ Исправление

# Правильно
for line in file:
    parts = line.strip().split(",")
    if len(parts) != 5:
        continue
    name, date, amount, category, city = parts

❌ Ошибка 7. Путаница в индексах sys.argv

# Неправильно
input_file = sys.argv[0]  # это имя скрипта, не первый аргумент
output_directory = sys.argv[1]

Почему плохо: sys.argv[0] всегда содержит имя запущенного скрипта. Первый аргумент пользователя находится в sys.argv[1].

✅ Исправление

# Правильно
input_file = sys.argv[1]
output_directory = sys.argv[2]