Методический материал: Работа с файлами в Python (Junior)
- Что такое файл
Файл — это объект хранения данных на диске. Python позволяет:
- читать данные из файла;
- записывать данные;
- изменять содержимое;
- работать с текстовыми и бинарными форматами.
Примеры файлов:
Текстовые:
- .txt
- .csv
- .json
- .log
- .py
Бинарные:
- .jpg
- .png
- .zip
- .exe
- .mp3
Главное отличие:
Тип Что хранит
Текстовый Символы
Бинарный Байты
⸻
- Функция open()
Для работы с файлом сначала его нужно открыть.
Синтаксис:
open(file, mode, encoding)
Параметры:
Параметр Назначение
file путь к файлу
mode режим открытия
encoding кодировка
Пример:
file = open("text.txt", "r", encoding="utf-8")
⸻
- Режимы открытия файла
r — чтение
Открывает файл только для чтения.
Ошибка, если файл отсутствует.
file = open("text.txt", "r")
⸻
w — запись
Полностью перезаписывает файл.
Если файла нет — создаёт.
file = open("text.txt", "w")
file.write("Hello")
Было:
старый текст
Стало:
Hello
⸻
a — дозапись
Добавляет данные в конец файла.
file = open("text.txt", "a")
file.write("\nНовая строка")
⸻
x — создание нового файла
Ошибка, если файл уже существует.
file = open("new.txt", "x")
⸻
b — бинарный режим
Для изображений, PDF, архивов.
file = open("image.jpg", "rb")
⸻
t — текстовый режим
Используется по умолчанию.
file = open("text.txt", "rt")
⸻
- — чтение и запись одновременно
file = open("text.txt", "r+")
⸻
Комбинации режимов
Режим Значение
rb чтение бинарного
wb запись бинарного
ab дозапись бинарного
r+ чтение + запись
w+ запись + чтение
a+ дозапись + чтение
⸻
- Обычный open()
Классический способ:
file = open("text.txt", "r")
data = file.read()
print(data)
file.close()
Здесь файл обязательно нужно закрывать.
Почему?
Открытый файл занимает системные ресурсы.
Если забыть закрыть:
- возможна утечка памяти;
- файл может заблокироваться;
- данные могут записаться некорректно.
Плохой пример:
file = open("text.txt", "w")
file.write("test")
close() забыли#
⸻
- Метод close()
Закрывает файл вручную.
file.close()
Проверка:
print(file.closed)
Результат:
True
⸻
- Конструкция with
Современный и правильный способ.
Синтаксис:
with open("text.txt", "r") as file:
text = file.read()
print(text)
После выхода из блока:
with
файл закрывается автоматически.
⸻
- Почему with лучше
Обычный способ
file = open("text.txt")
text = file.read()
file.close()
Проблема:
Если произойдёт ошибка:
file = open("text.txt")
1 / 0
file.close()
close() не выполнится.
Файл останется открытым.
⸻
Способ через with
with open("text.txt") as file:
1 / 0
Даже если ошибка произошла —
Python автоматически закроет файл.
⸻
Сравнение
open() with open()
Нужно close() Автоматическое закрытие
Риск забыть Безопасно
Старый подход Современный подход
Менее надёжно Более надёжно
Рекомендация Junior:
Всегда использовать with open()
⸻
- Чтение файла
read()
Читает всё содержимое.
Файл:
Привет
Python
Код:
with open("text.txt", "r", encoding="utf-8") as file:
data = file.read()
print(data)
⸻
read(n)
Читает определённое количество символов.
with open("text.txt") as file:
print(file.read(5))
⸻
readline()
Читает одну строку.
with open("text.txt") as file:
line = file.readline()
print(line)
⸻
readlines()
Читает все строки в список.
with open("text.txt") as file:
lines = file.readlines()
print(lines)
Результат:
[
'Привет\n',
'Python\n'
]
⸻
Чтение через цикл
Лучший способ для больших файлов.
with open("text.txt") as file:
for line in file:
print(line)
Плюс:
- меньше памяти;
- быстрее.
⸻
- Запись в файл
write()
with open("text.txt", "w") as file:
file.write("Hello")
⸻
Несколько строк
with open("text.txt", "w") as file:
file.write("line1\n")
file.write("line2\n")
⸻
writelines()
lines = [
"one\n",
"two\n",
"three\n"
]
with open("text.txt", "w") as file:
file.writelines(lines)
⸻
- Кодировки
Текст хранится в байтах.
Нужно понимать кодировку.
Правильно:
with open(
"text.txt",
encoding="utf-8"
) as file:
text = file.read()
Почему?
Иначе можно получить:
UnicodeDecodeError
Всегда использовать:
encoding="utf-8"
⸻
- Текстовые и бинарные файлы
Текстовый файл
with open("text.txt", "r") as file:
data = file.read()
Работа идёт со строками.
⸻
Бинарный файл
with open("image.jpg", "rb") as file:
data = file.read()
print(type(data))
Результат:
<class 'bytes'>
⸻
Копирование картинки
with open("image.jpg", "rb") as source:
content = source.read()
with open("copy.jpg", "wb") as target:
target.write(content)
⸻
- Указатель файла
У файла есть курсор.
Он показывает текущую позицию чтения.
⸻
tell()
Показывает позицию.
with open("text.txt") as file:
file.read(5)
print(file.tell())
⸻
seek()
Перемещает курсор.
with open("text.txt") as file:
file.seek(0)
text = file.read()
⸻
- Обработка ошибок
Файл не найден
try:
with open("abc.txt") as file:
print(file.read())
except FileNotFoundError:
print("Файл не найден")
⸻
Ошибка доступа
except PermissionError:
print("Нет доступа")
⸻
Ошибка кодировки
except UnicodeDecodeError:
print("Ошибка кодировки")
⸻
- Пути к файлам
Относительный путь
open("data.txt")
⸻
Абсолютный путь
Windows:
open(r"C:\folder\data.txt")
Linux/macOS:
open("/home/user/data.txt")
⸻
- pathlib
Современная работа с путями.
from pathlib import Path
path = Path("data.txt")
print(path.exists())
Чтение:
path.read_text()
Запись:
path.write_text("Hello")
⸻
-
Ошибки Junior
-
Забывают закрывать файл
Плохо:
file = open("test.txt")
Хорошо:
with open("test.txt") as file:
pass
⸻
- Используют w вместо a
w удаляет старое содержимое.
⸻
- Не указывают кодировку
Плохо:
open("text.txt")
Хорошо:
open(
"text.txt",
encoding="utf-8"
)
⸻
- Читают огромный файл через read()
Плохо:
data = file.read()
Хорошо:
for line in file:
print(line)
⸻
- Практика
Подсчёт строк
count = 0
with open("text.txt") as file:
for line in file:
count += 1
print(count)
⸻
Подсчёт слов
with open("text.txt") as file:
text = file.read()
words = len(text.split())
print(words)
⸻
Поиск слова
word = "python"
with open("text.txt") as file:
text = file.read()
if word in text:
print("Найдено")
⸻
Главное правило Junior
По умолчанию используй:
with open(
"file.txt",
"r",
encoding="utf-8"
) as file:
data = file.read()
Для бинарных файлов:
with open(
"image.png",
"rb"
) as file:
data = file.read()