Работа с файлами в Python
Сейчас мы затроним одну из самых фундаментальных возможностей программирования — работе с файлами. Умение корректно считывать данные из файлов и записывать их обратно пригодится вам практически в любом проекте. 📁
Файлы — это контейнеры для хранения данных на диске. Python предоставляет мощные и удобные инструменты для работы с ними. Давайте разберемся, как использовать эти инструменты!
Основные операции с файлами
В Python работа с файлами обычно включает следующие шаги:
- Открытие файла — указываем файл и режим работы с ним
- Чтение или запись — выполняем нужные операции с файлом
- Закрытие файла — освобождаем системные ресурсы
Рассмотрим каждый из этих шагов подробнее.
Открытие файлов
Для открытия файла в Python используется функция open(). Она принимает как минимум два параметра: путь к файлу и режим открытия.
Функция open(file, mode) возвращает объект файла, который можно использовать для чтения, записи или других операций с файлом.
Вот основные режимы открытия файлов:
Примеры открытия файлов в разных режимах:
# Открытие файла для чтения (режим по умолчанию - '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('sample.txt', 'w') as f: ... f.write("Первая строка\nВторая строка\nТретья строка") # Чтение всего файла целиком >>> with open('sample.txt', 'r') as file: ... content = file.read() ... print("Содержимое файла:") ... print(content)
Содержимое файла:Первая строкаВторая строкаТретья строка
Чтение файла построчно
# Чтение файла построчно с использованием цикла >>> with open('sample.txt', 'r') as file: ... print("Чтение построчно:") ... for line in file: ... print(f" Строка: {line.strip()}")
Чтение построчно:Строка: Первая строкаСтрока: Вторая строкаСтрока: Третья строка
Чтение определенного количества символов
# Чтение определенного количества символов >>> 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 символов: окаВторая
Чтение всех строк в список
# Чтение всех строк в список >>> with open('sample.txt', 'r') as file: ... lines = file.readlines() ... print(f"Список строк: {lines}")
Список строк: ['Первая строка\n', 'Вторая строка\n', 'Третья строка']
Запись в файл
Запись данных в файл также может осуществляться разными методами:
Запись строки
# Запись строки в файл >>> 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 - отличный язык программирования.
Запись нескольких строк
# Запись списка строк в файл >>> 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:Первая строкаВторая строкаТретья строка
Добавление данных в конец файла
# Добавление данных в конец файла (режим '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 — это безопасный способ работы с файлами, который гарантирует закрытие файла даже при возникновении ошибок.
Сравним два подхода:
# Традиционный подход (требует явного закрытия файла) >>> 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! 👍
Обработка исключений при работе с файлами
При работе с файлами могут возникать различные ошибки:
- Файл не существует
- Недостаточно прав для доступа к файлу
- Диск заполнен
- И т.д.
Хорошей практикой является обработка этих ошибок:
# Обработка возможных ошибок при открытии файла >>> try: ... with open('несуществующий_файл.txt', 'r') as file: ... content = file.read() ... except FileNotFoundError: ... print("Ошибка: Файл не найден!") ... except PermissionError: ... print("Ошибка: Недостаточно прав для доступа к файлу!") ... except Exception as e: ... print(f"Произошла ошибка: {e}")
Ошибка: Файл не найден!
Дополнительные операции с файлами
Python предоставляет множество дополнительных возможностей для работы с файлами:
Перемещение указателя
# Перемещение указателя в файле >>> 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): строка
Получение текущей позиции
# Получение текущей позиции указателя >>> 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 для облегчения работы с путями:
>>> 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:
>>> 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 и другие.