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

Сейчас мы затроним одну из самых фундаментальных возможностей программирования — работе с файлами. Умение корректно считывать данные из файлов и записывать их обратно пригодится вам практически в любом проекте. 📁

Файлы — это контейнеры для хранения данных на диске. 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

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

После открытия файла его содержимое можно прочитать несколькими способами:

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

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:. Это контекстный менеджер, который автоматически закрывает файл после завершения работы с ним.

Контекстный менеджер with — это безопасный способ работы с файлами, который гарантирует закрытие файла даже при возникновении ошибок.

Сравним два подхода:

Python 3.13
# Традиционный подход (требует явного закрытия файла)
>>> file = open('example.txt', 'w')
>>> try:
...     file.write("Пример текста")
... finally:
...     file.close()  # Файл нужно закрыть явно
...     print("Файл закрыт вручную")

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

Настоятельно рекомендуется всегда использовать контекстный менеджер with при работе с файлами в Python! 👍

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

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

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

Хорошей практикой является обработка этих ошибок:

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()}") # Получение имени файла и расширения >>> document_path = Path("path/to/document.pdf") >>> print(f"Имя файла: {document_path.stem}, расширение: {document_path.suffix}")
Имя файла: document, расширение: .pdf

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

Давайте проверим, насколько хорошо вы усвоили тему работы с файлами:

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

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


Мы с вами на связи
Русский