Работа с файлами в Python

Любая переменная живёт только пока запущена программа: закрыли её — и список задач, набранный счёт, сохранённые настройки исчезли. Чтобы данные пережили перезапуск, их записывают в файл на диске, а при следующем запуске читают обратно. На этом держатся заметки, сохранения в играх, экспорт отчётов — почти любое приложение.

Файл — это именованный набор данных на диске. Разберём по порядку: как открыть файл, прочитать из него, записать в него и почему важно его закрыть.

Основные операции с файлами

В Python работа с файлами обычно включает следующие шаги:

  1. Открытие файла — указываем файл и режим работы с ним
  2. Чтение или запись — выполняем нужные операции с файлом
  3. Закрытие файла — освобождаем системные ресурсы

Рассмотрим каждый из этих шагов подробнее.

Открытие файлов

Для открытия файла в Python используется функция open(). Она принимает как минимум два параметра: путь к файлу и режим открытия.

Функция open(file, mode) возвращает объект файла, который можно использовать для чтения, записи или других операций с файлом.

Вот основные режимы открытия файлов:

РежимОписание
'r'Чтение (режим по умолчанию)
'w'Запись (создает новый файл или перезаписывает существующий)
'a'Добавление (append) — дописывает данные в конец файла
'b'Бинарный режим (например, 'rb' для чтения бинарного файла)
't'Текстовый режим (режим по умолчанию)
'+'Обновление (чтение и запись)

Примеры открытия файлов в разных режимах:

Python 3.13
# Открытие файла для чтения (режим по умолчанию - 'r')
file = open('example.txt', 'r')
print(f"Файл открыт в режиме: {file.mode}")
file.close()
Файл открыт в режиме: r
# Открытие файла для записи
file = open('new_file.txt', 'w')
print(f"Файл открыт в режиме: {file.mode}")
file.close()
Файл открыт в режиме: w
# Открытие бинарного файла для чтения
file = open('image.jpg', 'rb')
print(f"Файл открыт в режиме: {file.mode}")
file.close()
Файл открыт в режиме: rb

Чтение из файла

После открытия файла его содержимое можно прочитать несколькими способами. В примерах ниже файл открывается через with open(...) as ... — это безопасный способ, который сам закроет файл в конце; разберём его чуть ниже, а пока достаточно читать как «открыть файл на время блока».

Чтение всего файла

Python 3.13
# Создадим тестовый файл
with open('sample.txt', 'w') as f:
    f.write("Первая строка\nВторая строка\nТретья строка")

# Чтение всего файла целиком
with open('sample.txt', 'r') as file:
    content = file.read()
    print("Содержимое файла:")
    print(content)
Содержимое файла:
Первая строка
Вторая строка
Третья строка

Чтение файла построчно

Python 3.13
# Чтение файла построчно с использованием цикла
with open('sample.txt', 'r') as file:
    print("Чтение построчно:")
    for line in file:
        print(f"  Строка: {line.strip()}")
Чтение построчно:
  Строка: Первая строка
  Строка: Вторая строка
  Строка: Третья строка

Чтение определенного количества символов

Python 3.13
# Чтение определенного количества символов
with open('sample.txt', 'r') as file:
    first_10_chars = file.read(10)
    print(f"Первые 10 символов: {first_10_chars}")

    # Чтение следующих 10 символов
    next_10_chars = file.read(10)
    print(f"Следующие 10 символов: {next_10_chars}")
Первые 10 символов: Первая стр
Следующие 10 символов: ока
Вторая

Чтение всех строк в список

Python 3.13
# Чтение всех строк в список
with open('sample.txt', 'r') as file:
    lines = file.readlines()
    print(f"Список строк: {lines}")
Список строк: ['Первая строка\n', 'Вторая строка\n', 'Третья строка']

Запись в файл

Запись данных в файл также может осуществляться разными методами:

Запись строки

Python 3.13
# Запись строки в файл
with open('output.txt', 'w') as file:
    file.write("Привет, мир!\n")
    file.write("Python - отличный язык программирования.")

# Проверим, что записалось
with open('output.txt', 'r') as file:
    content = file.read()
    print("Содержимое файла после записи:")
    print(content)
Содержимое файла после записи:
Привет, мир!
Python - отличный язык программирования.

Запись нескольких строк

Python 3.13
# Запись списка строк в файл
lines = ["Первая строка", "Вторая строка", "Третья строка"]

with open('lines.txt', 'w') as file:
    for line in lines:
        file.write(line + '\n')

# Альтернативный способ: использование writelines()
with open('lines2.txt', 'w') as file:
    # Не забудьте добавить символы переноса строки
    file.writelines([line + '\n' for line in lines])

# Проверим второй файл
with open('lines2.txt', 'r') as file:
    content = file.read()
    print("Содержимое файла lines2.txt:")
    print(content)
Содержимое файла lines2.txt:
Первая строка
Вторая строка
Третья строка

Добавление данных в конец файла

Python 3.13
# Добавление данных в конец файла (режим 'a')
with open('output.txt', 'a') as file:
    file.write("\nЭта строка добавлена позже.")

# Проверим результат
with open('output.txt', 'r') as file:
    content = file.read()
    print("Содержимое файла после добавления:")
    print(content)
Содержимое файла после добавления:
Привет, мир!
Python - отличный язык программирования.
Эта строка добавлена позже.

Контекстный менеджер with

Во всех примерах выше файл открывался через with open(...) as file:. Пора объяснить эту конструкцию.

Открытый файл нужно закрывать: пока он открыт, он держит системные ресурсы, а записанные данные могут не попасть на диск до закрытия. Закрыть можно вручную:

Python 3.13
file = open('example.txt', 'w')
file.write("Пример текста")
file.close()

Загвоздка в том, что про close() легко забыть. А если между открытием и закрытием что-то пойдёт не так и программа прервётся, до close() дело вообще не дойдёт, и файл останется открытым.

Конструкция with снимает эту заботу: она сама закрывает файл, когда блок заканчивается, при любом исходе.

Python 3.13
with open('example.txt', 'w') as file:
    file.write("Пример текста")
# здесь файл уже закрыт автоматически
print("Файл закрыт автоматически после блока with")
Файл закрыт автоматически после блока with

Контекстный менеджер with гарантирует, что файл закроется, даже если внутри блока возникнет ошибка. Это стандартный способ работы с файлами в Python, и дальше используется именно он.

Обработка исключений при работе с файлами

При работе с файлами могут возникать различные ошибки:

  • Файл не существует
  • Недостаточно прав для доступа к файлу
  • Диск заполнен
  • И т.д.

Перехватывать такие ошибки и реагировать на них умеет конструкция try/except — ей посвящён отдельный урок дальше в курсе. Здесь достаточно увидеть её в действии на файлах: блок try пробует выполнить операцию, а except ловит конкретную ошибку, если она случилась.

Python 3.13
# Обработка возможных ошибок при открытии файла
try:
    with open('несуществующий_файл.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("Ошибка: Файл не найден!")
except PermissionError:
    print("Ошибка: Недостаточно прав для доступа к файлу!")
except Exception as e:
    print(f"Произошла ошибка: {e}")
Ошибка: Файл не найден!

Дополнительные операции с файлами

Python предоставляет множество дополнительных возможностей для работы с файлами:

Перемещение указателя

Python 3.13
# Перемещение указателя в файле
with open('sample.txt', 'r') as file:
    # Прочитаем первые 6 символов
    print(file.read(6))

    # Переместим указатель на начало файла
    file.seek(0)
    print("После file.seek(0):", file.read(6))

    # Переместим указатель на 8-ю позицию
    file.seek(8)
    print("После file.seek(8):", file.read(6))
Первая
После file.seek(0): Первая
После file.seek(8): строка

Получение текущей позиции

Python 3.13
# Получение текущей позиции указателя
with open('sample.txt', 'r') as file:
    print(f"Начальная позиция: {file.tell()}")
    file.read(10)
    print(f"Позиция после чтения 10 символов: {file.tell()}")
    file.readline()
    print(f"Позиция после чтения строки: {file.tell()}")
Начальная позиция: 0
Позиция после чтения 10 символов: 10
Позиция после чтения строки: 14

Работа с путями к файлам

При работе с файлами важно правильно указывать пути. Python предоставляет модуль os.path и модуль pathlib для облегчения работы с путями:

Python 3.13
import os

# Текущий рабочий каталог
current_dir = os.getcwd()
print(f"Текущий каталог: {current_dir}")
Текущий каталог: /путь/к/текущей/директории
# Объединение путей (корректная работа с разделителями)
data_file = os.path.join(current_dir, 'data', 'info.txt')
print(f"Путь к файлу: {data_file}")
Путь к файлу: /путь/к/текущей/директории/data/info.txt
# Проверка существования файла
sample_exists = os.path.exists('sample.txt')
print(f"Файл sample.txt существует: {sample_exists}")
Файл sample.txt существует: True
# Получение имени файла и расширения
filename = "path/to/document.pdf"
basename = os.path.basename(filename)
name, ext = os.path.splitext(basename)
print(f"Имя файла: {name}, расширение: {ext}")
Имя файла: document, расширение: .pdf

Более современный подход с использованием pathlib:

Python 3.13
from pathlib import Path

# Текущий каталог
current_path = Path.cwd()
print(f"Текущий каталог: {current_path}")
Текущий каталог: /путь/к/текущей/директории
# Создание пути
data_file = current_path / 'data' / 'info.txt'
print(f"Путь к файлу: {data_file}")
Путь к файлу: /путь/к/текущей/директории/data/info.txt
# Проверка существования файла
sample_path = Path('sample.txt')
print(f"Файл sample.txt существует: {sample_path.exists()}")
Файл sample.txt существует: True
# Получение имени файла и расширения
document_path = Path("path/to/document.pdf")
print(f"Имя файла: {document_path.stem}, расширение: {document_path.suffix}")
Имя файла: document, расширение: .pdf

Проверка понимания

Какой код корректно открывает файл для записи и добавляет в конец файла строку?

В следующих уроках мы углубимся в работу с конкретными типами файлов, такими как текстовые файлы, CSV, JSON и другие.