Зачем работать с файлами
Данные между запусками программы нужно где-то хранить. Файлы позволяют сохранять информацию, обмениваться ею между программами и обрабатывать большие объёмы данных, которые не помещаются в оперативную память. Примеры: конфигурации, логи, отчёты, CSV-таблицы, JSON-документы.
Текстовые и бинарные файлы
Все файлы делятся на два больших типа:
- Текстовые файлы хранят информацию в виде обычного текста. Используют кодировки (UTF-8, CP1251 и др.). Примеры расширений:
.txt,.csv,.json,.html,.py. - Бинарные файлы хранят данные в двоичном формате, не читаемом человеком напрямую. Используются для изображений, видео, исполняемых файлов, баз данных. Примеры:
.jpg,.png,.mp4,.exe,.zip.
# data.txt — текстовый файл
Name,Age
Anna,25
Ivan,30
# image.jpg — бинарный файл
\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00
Функция open()
Функция open() используется для открытия файла и возвращает объект файла.
open(file, mode="r", encoding="utf-8")
file— путь к файлу (относительный или абсолютный).mode— режим работы с файлом ("r","w","a","b"и др.).encoding— кодировка текста. Используется только для текстовых файлов.
Режимы работы с файлами
При открытии файла с помощью open() необходимо указать режим. По умолчанию файл открывается в режиме "rt" (чтение текста).
| Режим | Описание |
|---|---|
"r" | Чтение (по умолчанию). Ошибка, если файла нет. |
"w" | Запись. Создаёт новый файл или перезаписывает существующий. |
"a" | Добавление в конец файла. Создаёт новый, если его нет. |
"x" | Создание нового файла. Ошибка, если файл уже существует. |
"b" | Бинарный режим (например, "rb", "wb"). |
"t" | Текстовый режим (по умолчанию). |
"+" | Открытие файла и для чтения, и для записи ("r+", "w+", "a+", "x+"). |
Режимы можно комбинировать: "rb" — чтение в бинарном режиме, "wt" — запись в текстовом режиме, "a+" — добавление и чтение.
Параметр encoding
Параметр encoding указывает кодировку текста. Он особенно важен при работе с файлами, содержащими символы, отличные от стандартных ASCII.
utf-8— универсальная кодировка, поддерживает все языки. Используется по умолчанию в Python 3.cp1251— кодировка Windows для русского языка.ascii— ограничена английскими символами (0–127), устаревшая.utf-16,utf-32,iso-8859-1— другие распространённые кодировки.
Если encoding не указан, Python использует кодировку по умолчанию, которая зависит от операционной системы. Неверная кодировка может вызвать UnicodeDecodeError.
# Рекомендуется явно указывать encoding
with open("data.txt", "r", encoding="utf-8") as file:
content = file.read()
Функция close()
После работы с файлом его нужно закрыть методом close(). Закрытие освобождает системные ресурсы, гарантирует сохранение данных и предотвращает ошибки доступа.
# Ручное открытие и закрытие
file = open("example.txt", "r", encoding="utf-8")
content = file.read()
print(content)
file.close()
Если забыть вызвать close(), файл может остаться открытым, особенно в Windows, где открытый файл блокируется для других программ.
Контекстный менеджер with
Контекстный менеджер with — предпочтительный способ работы с файлами в Python. Он автоматически закрывает файл после выхода из блока, даже если внутри блока возникло исключение.
with open("example.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
# file.close() вызывается автоматически
Файл открывается только внутри блока with. После выхода из блока он автоматически закрывается.
Чтение из файла
Когда файл открывается, указатель устанавливается в начало файла. По мере чтения он смещается вперёд.
Метод read()
Считывает весь текст из файла в одну строку.
with open("example.txt", "r", encoding="utf-8") as file:
content = file.read()
print(type(content)) # <class 'str'>
print(content)
- Читает весь файл целиком.
- Если файл большой, может занять много памяти.
- Указатель после чтения перемещается в конец файла.
- Переносы строк сохраняются как
\n.
Метод read(n)
Считывает указанное количество символов.
with open("example.txt", "r", encoding="utf-8") as file:
chunk = file.read(10)
print(chunk)
Метод readline()
Читает одну строку за вызов.
with open("example.txt", "r", encoding="utf-8") as file:
print(file.readline())
print(file.readline())
Метод readlines()
Загружает все строки файла в список.
with open("example.txt", "r", encoding="utf-8") as file:
lines = file.readlines()
print(type(lines)) # <class 'list'>
print(lines)
Чтение файла в цикле
Файл является итерируемым объектом, поэтому его можно перебирать построчно без загрузки всего файла в память.
with open("example.txt", "r", encoding="utf-8") as file:
for line in file:
print(line, end="")
Запись в файл
Метод write()
Записывает строку в файл.
with open("users.txt", "w", encoding="utf-8") as file:
file.write("ID: 201 | Name: John | Age: 25 | Status: Active\n")
- Создаёт файл, если его нет.
- В режиме
"w"удаляет старые данные. write()не добавляет символ\nавтоматически.
Метод writelines()
Записывает список строк подряд.
data = [
"ID: 202 | Name: Alice | Age: 30 | Status: Inactive\n",
"ID: 203 | Name: Bob | Age: 27 | Status: Active\n",
]
with open("users.txt", "w", encoding="utf-8") as file:
file.writelines(data)
Символ \n нужно добавлять вручную, иначе строки сольются в одну.
Другие популярные режимы
Режим "a" — добавление
Сохраняет существующее содержимое и дописывает данные в конец.
with open("users.txt", "a", encoding="utf-8") as file:
file.write("Extra line\n")
Режим "r+" — чтение и запись
Позволяет и читать, и записывать данные в файл без удаления содержимого.
with open("users.txt", "r+", encoding="utf-8") as file:
content = file.read()
file.write("\nAppended text")
Файл должен существовать. Запись начинается с текущей позиции указателя, поэтому после read() новые данные дописываются в конец.
Режим "x" — создание нового файла
Используется, если нужно гарантированно создать новый файл и избежать перезаписи существующих данных.
try:
with open("new_file.txt", "x", encoding="utf-8") as file:
file.write("Created in mode 'x'.\n")
except FileExistsError:
print("File already exists.")
Контекстный менеджер с несколькими файлами
Можно открывать несколько файлов одновременно в одном блоке with.
with (
open("example.txt", "r", encoding="utf-8") as infile,
open("output.txt", "w", encoding="utf-8") as outfile,
):
for line in infile:
outfile.write(line.upper())
Оба файла будут автоматически закрыты после выхода из блока. Это удобно для копирования, фильтрации и преобразования данных.
Краткий итог
Работа с файлами в Python строится вокруг функции open(), режимов и кодировки. Для безопасности и чистоты кода используйте with open(...) as f. Выбирайте метод чтения в зависимости от размера файла: read() для небольших, цикл for line in f для больших. При записи не забывайте про символ \n.