❌ Ошибка 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]