❌ Ошибка 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() не разбирается в исходной лекции. Он управляет переводами строк в текстовом режиме и может быть полезен при кроссплатформенной работе.