Привет! Ты уже умеешь читать и записывать данные, но пришло время научиться работать с реальными файлами. Текстовые файлы — самый простой способ хранить информацию: логи, настройки, данные, стихи… В Python работать с ними очень просто и удобно.
В этой статье мы разберём:
- Как открывать и закрывать файлы
- Режимы открытия:
r,w,a,r+ - Как читать файл целиком и по строкам
- Как записывать и добавлять данные
- Менеджер контекста
with - Практические примеры
- Что нужно знать перед началом
- Основная часть
- Открытие файла: open()
- Режимы открытия файлов
- Чтение файлов: read(), readline(), readlines()
- read() — читает весь файл целиком
- readline() — читает одну строку
- readlines() — читает все строки в список
- Итерация по файлу (самый эффективный способ)
- Запись файлов: write(), writelines()
- write() — записывает одну строку
- writelines() — записывает список строк
- Добавление в конец файла (append)
- Менеджер контекста with
- Обработка ошибок при работе с файлами
- Работа с кодировками
- Практические примеры
- Логирование действий в файл
- Сохранение списка задач в файл
- Подсчёт слов в тексте
- Объединение нескольких файлов
- Задачи для закрепления
- Нюансы и подводные камни
- Кодировки
- Символы новой строки
- Режим ‘w’ перезаписывает файл
- Частые ошибки и как их избежать
- Ошибка 1: Забыл закрыть файл
- Ошибка 2: Неправильный режим открытия
- Ошибка 3: Забыл \n при записи
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python (модули для работы с файлами встроенные)
- Базовое понимание строк и списков
Совет: Всегда используй менеджер контекста
with— он автоматически закрывает файл, даже если произошла ошибка.
Основная часть
Открытие файла: open()
Функция open() открывает файл и возвращает файловый объект.
# Базовый синтаксис
file = open('example.txt', 'r') # Открываем для чтения
content = file.read()
file.close() # Всегда закрываем!
print(content)Совет: Не забывай закрывать файлы! Иначе могут возникнуть проблемы с памятью и блокировкой файлов.
Режимы открытия файлов
| Режим | Описание |
|---|---|
'r' | Чтение (файл должен существовать) |
'w' | Запись (создаёт новый или перезаписывает) |
'a' | Добавление в конец файла |
'r+' | Чтение и запись (файл должен существовать) |
'x' | Создание нового файла (ошибка, если существует) |
# Чтение (файл должен существовать)
file = open('data.txt', 'r')
# Запись (перезаписывает файл)
file = open('output.txt', 'w')
# Добавление в конец
file = open('log.txt', 'a')
# Чтение и запись
file = open('data.txt', 'r+')Совет: Для текстовых файлов используй
'r','w','a'. Для бинарных —'rb','wb'.
Чтение файлов: read(), readline(), readlines()
read() — читает весь файл целиком
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)# Чтение первых N символов
with open('example.txt', 'r', encoding='utf-8') as file:
first_100 = file.read(100)
print(first_100)readline() — читает одну строку
with open('example.txt', 'r', encoding='utf-8') as file:
line1 = file.readline()
line2 = file.readline()
print(f"Строка 1: {line1.strip()}")
print(f"Строка 2: {line2.strip()}")readlines() — читает все строки в список
with open('example.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
print(lines) # ['Строка 1\n', 'Строка 2\n', 'Строка 3\n']
# Убираем \n
lines_clean = [line.strip() for line in lines]
print(lines_clean) # ['Строка 1', 'Строка 2', 'Строка 3']Итерация по файлу (самый эффективный способ)
with open('example.txt', 'r', encoding='utf-8') as file:
for line in file:
print(line.strip())Совет: Для больших файлов всегда используй итерацию по файлу — это не загружает весь файл в память!
Запись файлов: write(), writelines()
write() — записывает одну строку
with open('output.txt', 'w', encoding='utf-8') as file:
file.write('Первая строка\n')
file.write('Вторая строка\n')writelines() — записывает список строк
lines = [
'Строка 1\n',
'Строка 2\n',
'Строка 3\n'
]
with open('output.txt', 'w', encoding='utf-8') as file:
file.writelines(lines)Совет:
writelines()не добавляет переносы строк автоматически. Нужно добавлять\nвручную!
Добавление в конец файла (append)
Используй режим 'a' (append):
with open('log.txt', 'a', encoding='utf-8') as file:
file.write('Новая запись в логе\n')
file.write('Ещё одна запись\n')Менеджер контекста with
with автоматически закрывает файл, даже если произошла ошибка.
# Без with (небезопасно)
file = open('data.txt', 'r')
content = file.read()
file.close() # Если ошибка до close() — файл не закроется
# С with (безопасно)
with open('data.txt', 'r') as file:
content = file.read()
# Файл автоматически закрытСовет: Всегда используй
with! Это безопаснее и короче.
Обработка ошибок при работе с файлами
def safe_read_file(filename):
try:
with open(filename, 'r', encoding='utf-8') as file:
return file.read()
except FileNotFoundError:
print(f"Ошибка: файл {filename} не найден")
return None
except PermissionError:
print(f"Ошибка: нет доступа к файлу {filename}")
return None
except UnicodeDecodeError:
print(f"Ошибка: файл {filename} в другой кодировке")
return None
# Использование
content = safe_read_file('missing.txt')Работа с кодировками
# Русский текст — обязательно указывай encoding='utf-8'
with open('russian.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
# При записи тоже указывай
with open('russian.txt', 'w', encoding='utf-8') as file:
file.write('Привет, мир!')Совет: Никогда не забывай
encoding='utf-8'для русских текстов!
Практические примеры
Логирование действий в файл
import datetime
def log_message(message):
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
with open('log.txt', 'a', encoding='utf-8') as file:
file.write(f"[{timestamp}] {message}\n")
# Использование
log_message('Программа запущена')
log_message('Пользователь вошёл в систему')
log_message('Программа завершена')Сохранение списка задач в файл
def save_tasks(tasks):
with open('tasks.txt', 'w', encoding='utf-8') as file:
for task in tasks:
file.write(f"{task}\n")
def load_tasks():
try:
with open('tasks.txt', 'r', encoding='utf-8') as file:
return [line.strip() for line in file]
except FileNotFoundError:
return []
# Использование
tasks = ['Купить хлеб', 'Сделать домашку', 'Позвонить маме']
save_tasks(tasks)
loaded = load_tasks()
print("Загруженные задачи:")
for task in loaded:
print(f" • {task}")Подсчёт слов в тексте
def count_words_in_file(filename):
try:
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
words = content.split()
return len(words)
except FileNotFoundError:
print(f"Файл {filename} не найден")
return 0
# Использование
word_count = count_words_in_file('example.txt')
print(f"Количество слов в файле: {word_count}")Объединение нескольких файлов
def merge_files(input_files, output_file):
with open(output_file, 'w', encoding='utf-8') as outfile:
for filename in input_files:
try:
with open(filename, 'r', encoding='utf-8') as infile:
content = infile.read()
outfile.write(f"\n--- {filename} ---\n")
outfile.write(content)
outfile.write("\n")
except FileNotFoundError:
print(f"Предупреждение: файл {filename} не найден")
# Использование
merge_files(['file1.txt', 'file2.txt', 'file3.txt'], 'merged.txt')Задачи для закрепления
Задача 1. Открой файл data.txt для чтения и выведи его содержимое.
Задача 2. Запиши список строк ['line1', 'line2', 'line3'] в файл output.txt.
Задача 3. Добавь строку ‘Новая строка’ в конец файла data.txt.
Задача 4. Напиши функцию, которая читает файл и возвращает количество строк в нём.
Задача 5. Объясни разницу между read() и readlines().
Ответы:
Задача 1.
with open('data.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)Задача 2.
lines = ['line1\n', 'line2\n', 'line3\n']
with open('output.txt', 'w', encoding='utf-8') as file:
file.writelines(lines)Задача 3.
with open('data.txt', 'a', encoding='utf-8') as file:
file.write('Новая строка\n')Задача 4.
def count_lines(filename):
try:
with open(filename, 'r', encoding='utf-8') as file:
return len(file.readlines())
except FileNotFoundError:
return 0Задача 5.
read() возвращает весь файл как одну строку. readlines() возвращает список строк (каждая строка — элемент списка).
Нюансы и подводные камни
Кодировки
Если не указать encoding, Python использует кодировку по умолчанию. Это может привести к ошибкам. Всегда указывай encoding='utf-8'.
Символы новой строки
В разных ОС символы новой строки отличаются:
- Windows:
\r\n - Linux/Mac:
\n
Python автоматически преобразует их, если нужно.
Режим ‘w’ перезаписывает файл
Будь осторожен: режим 'w' уничтожает всё содержимое файла при открытии!
Частые ошибки и как их избежать
Ошибка 1: Забыл закрыть файл
# Плохо — файл не закрыт
file = open('data.txt', 'r')
content = file.read()
# Хорошо — with закрывает автоматически
with open('data.txt', 'r') as file:
content = file.read()Ошибка 2: Неправильный режим открытия
# Ошибка — файл не существует
with open('missing.txt', 'r') as file:
content = file.read()
# Проверь существование или используй try-exceptОшибка 3: Забыл \n при записи
# Все строки склеятся
file.write('Строка 1')
file.write('Строка 2')
# Результат: Строка 1Строка 2
# Добавляй переносы
file.write('Строка 1\n')
file.write('Строка 2\n')Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Открыть для чтения | open('file.txt', 'r') |
| Открыть для записи | open('file.txt', 'w') |
| Открыть для добавления | open('file.txt', 'a') |
| Безопасное открытие | with open('file.txt', 'r') as file: |
| Прочитать весь файл | content = file.read() |
| Прочитать строку | line = file.readline() |
| Прочитать все строки | lines = file.readlines() |
| Прочитать по строкам (эффективно) | for line in file: |
| Записать строку | file.write('текст\n') |
| Записать список строк | file.writelines(list) |
| Указать кодировку | encoding='utf-8' |
Заключение
Сегодня мы научились:
- Открывать файлы в разных режимах (
r,w,a,r+) - Читать файлы через
read(),readline(),readlines() - Записывать через
write()иwritelines() - Использовать
withдля безопасной работы - Обрабатывать ошибки с
try-except








