Управление ресурсами Python: открытие и чтение файлов
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
При использовании конструкции with
для открытия файла дескриптор этого файла автоматически закрывается по завершении блока кода:
with open('file.txt') as file:
content = file.read()
# Файл закрывается, нет необходимости беспокоиться об этом
Если же вы открываете файл напрямую, не забывайте о необходимости его закрыть:
file = open('file.txt')
content = file.read()
file.close() # Не забывайте закрывать файл, чтобы избежать проблем
В CPython, благодаря реализации сборки мусора, файл будет закрыт автоматически, как только на него не будет больше ссылок. Однако полагаться на подобное автоматическое закрытие не следует.
Более подробно о операторе with
Оператор with
был введён в PEP 343 и обеспечивает автоматическое освобождение ресурсов после их использования.
Традиционный метод работы с файлами
При использовании открытия файла без with
, он остаётся открытым до тех пор, пока его явно не закроют или не завершится программа:
file = open('file.txt', 'r')
content = file.read()
# Файл до сих пор открыт, и его необходимо закрыть вручную
Современный метод с использованием pathlib
pathlib
появился в Python 3.4 и представляет собой удобный и современный способ работы с файлами:
from pathlib import Path
content = Path('file.txt').read_text()
# Операция производится быстро и кратко
У вас старая версия Python? Можно воспользоваться pathlib2
для получения аналогичных функциональных возможностей.
Визуализация
Можно представить чтение файла как заказ еды на вынос. Выход из блока with
– это как выезд из ресторана, при котором файл автоматически закрывается.
Заказ готов: 🍔🍟 (Чтение файла завершено)
Уезжаем из заведения: 🚗💨 (Выходим из блока 'with')
Вход в микрофон отключён: 🔇 (Файл закрыт)
Полезные материалы
Чтение больших файлов
Для больших файлов рекомендуется читать их построчно:
with open('file.txt', 'r') as file:
for line in file:
process_line(line)
# Это поможет вам сэкономить память
Обработка ошибок
При использовании pathlib.read_text()
можно сразу же настроить обработку ошибок кодирования:
content = Path('file.txt').read_text(encoding='utf-8', errors='ignore')
# При этом вы не будете обращать внимание на ошибки кодировки
Использование strip() для очистки данных
Метод .strip()
помогает удалить лишние пробелы и переводы строк:
lines = [line.strip() for line in open('file.txt')]
# Очищаем данные так же, как мы очищаем нашу жизнь от ненужного
Завершение
Будьте осмотрительны при работе с файлами
Рассчитывать на финализаторы для закрытия файлов не стоит. После завершения просчета программы финализаторы ведут себя непредсказуемо.
Учитывайте возможность утечек ресурсов
Неудачное управление файловыми дескрипторами может вызвать утечки ресурсов, что негативно скажется на производительности или может блокировать необходимые операции.
Улучшайте производительность вашего скрипта
Тщательное использование менеджеров контекста способно улучшить производительность вашего скрипта, предотвращая ненужное долгое открытие файлов.
Умейте понимать, когда приходит время закрыть файл:
- После всех непосредственных операций с файлом, если вы не используете
with
. - При работе с временными файлами.
- Перед удалением или изменением файлов, чтобы избежать ошибок доступа.