📖 Теория: Основы работы с файлами

⚡ Кратко

Файлы делятся на текстовые (читаемые, с кодировкой) и бинарные (не читаемые напрямую, для изображений, видео, архивов).

Функция open(file, mode, encoding) возвращает объект файла. Режим по умолчанию — "rt" (чтение текста).

Контекстный менеджер with open(...) as f: автоматически закрывает файл. Для чтения используют read(), readline(), readlines() или цикл for line in f. Для записи — write() и writelines().

Режимы a (добавление), r+ (чтение + запись) и x (создание без перезаписи) используются для специальных задач.

Зачем работать с файлами

Данные между запусками программы нужно где-то хранить. Файлы позволяют сохранять информацию, обмениваться ею между программами и обрабатывать большие объёмы данных, которые не помещаются в оперативную память. Примеры: конфигурации, логи, отчёты, 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.