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

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

  • Забыть указать encoding="utf-8" при работе с русским текстом.
  • Не закрыть файл, используя open() без with или close().
  • Перепутать режимы "w" (перезапись) и "a" (добавление).

❌ Ошибка 1. Забыли указать encoding

# Неправильно
with open("data.txt", "r") as file:
    content = file.read()
    print(content)  # UnicodeDecodeError на Windows с cp1251

Почему плохо: если не указать кодировку, Python использует системную по умолчанию. На Windows с русским текстом это часто приводит к UnicodeDecodeError.

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

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

❌ Ошибка 2. Не закрыли файл

# Неправильно
file = open("data.txt", "w", encoding="utf-8")
file.write("important data\n")
# файл остаётся открытым, данные могут не сохраниться

Почему плохо: открытый файл занимает системные ресурсы. В Windows файл может оставаться заблокированным. При аварийном завершении программы данные могут не записаться на диск.

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

# Правильно
with open("data.txt", "w", encoding="utf-8") as file:
    file.write("important data\n")

❌ Ошибка 3. Путаем режимы w и a

# Неправильно
with open("log.txt", "w", encoding="utf-8") as file:
    file.write("new event\n")
# старые записи в log.txt удалены!

Почему плохо: режим "w" всегда обнуляет файл. Для логов и накопления данных нужен "a".

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

# Правильно
with open("log.txt", "a", encoding="utf-8") as file:
    file.write("new event\n")

❌ Ошибка 4. Читаем файл после закрытия

# Неправильно
with open("data.txt", "r", encoding="utf-8") as file:
    content = file.read()

print(file.read())  # ValueError: I/O operation on closed file.

Почему плохо: после выхода из блока with файл закрыт, и любые операции с ним вызывают ошибку.

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

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

print(content)  # используем сохранённые данные

❌ Ошибка 5. write() без \n

# Неправильно
lines = ["first", "second", "third"]
with open("out.txt", "w", encoding="utf-8") as file:
    for line in lines:
        file.write(line)
# В файле: firstsecondthird

Почему плохо: метод write() не добавляет перенос строки автоматически. Без \n все данные сливаются.

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

# Правильно
lines = ["first", "second", "third"]
with open("out.txt", "w", encoding="utf-8") as file:
    for line in lines:
        file.write(line + "\n")

❌ Ошибка 6. Игнорируем обработку исключений

# Неправильно
filename = input("Введите имя файла: ")
with open(filename, "r", encoding="utf-8") as file:
    print(file.read())
# FileNotFoundError аварийно завершит программу

Почему плохо: пользователь может ввести несуществующее имя файла. Без обработки программа «падает».

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

# Правильно
filename = input("Введите имя файла: ")
try:
    with open(filename, "r", encoding="utf-8") as file:
        print(file.read())
except FileNotFoundError:
    print(f"Ошибка: файл '{filename}' не найден.")

❌ Ошибка 7. Неправильная обработка newline

# Неправильно
with open("data.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(line)  # между строками появляются лишние пустые строки

Почему плохо: каждая строка уже содержит символ \n в конце. Функция print() добавляет ещё один перенос строки.

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

# Правильно
with open("data.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(line, end="")
⚠️ Проверить по документации: параметр newline функции open() не разбирается в исходной лекции. Он управляет переводами строк в текстовом режиме и может быть полезен при кроссплатформенной работе.