Сообщить об ошибке.

Открытие/закрытие файла для чтения/записи в Python

Прежде чем начать работать с файлом, первое, что нужно сделать, это открыть его. Это делается путем вызова встроенной функции open(). Она имеет единственный обязательный аргумент, который представляет путь к файлу filename, но чаще всего используется с двумя аргументами и возвращает объект file object:

>>> fp = open('filename', 'w')

Первый аргумент filename - это строка, содержащая имя файла. Второй аргумент mode - это другая строка, содержащая несколько символов, описывающих способ использования файла. режим может быть, 'r' когда файл будет только читаться, 'w' только для записи (существующий файл с таким же именем будет удален) и 'a' открывается файл для добавления, любые данные, записанные в файл, автоматически добавляются в конец. Режим 'r+' открывает файл для чтения и записи. Аргумент mode является необязательным. По умолчанию будет предполагаться, что файл открыт на чтение, если mode опущен.

Обычно файлы открываются в текстовом режиме, то есть вы читаете и пишете строки из файла и в файл, которые закодированы в определенной кодировке. Если кодировка не указана, по умолчанию используется кодировка платформы (смотрите описание встроенной функции open()). При добавлении в аргумент mode литерала 'b' файл открывается в двоичном режиме. Теперь данные читаются и записываются в виде байтовых объектов. Этот режим следует использовать для всех файлов, которые не содержат текст.

В текстовом режиме, используемом по умолчанию, при чтении файла выполняется преобразование концовок строк, эти преобразования зависят от платформы. Символы конца строки \n в Unix, \r\n в Windows, в значение \n. При записи файла записи в текстовом режиме по умолчанию выполняется преобразование вхождений \n обратно в концовки строк, соответствующие платформам. Эта закулисная модификация данных подходит для текстовых файлов, но будет повреждать двоичные данные, такие как файлы JPEG или EXE. Будьте очень осторожны, используя двоичный режим при чтении и записи таких файлов.

Рекомендуется использовать контекстный менеджер with при работе с файловыми объектами. Преимущество заключается в том, что файл правильно закрывается после завершения, даже если в какой-то момент возникает исключение. Использование with также намного короче, чем писать эквивалентные try-finally блоки:

>>> with open('filename') as fp:
...     read_data = fp.read()

# Мы можем проверить, что файл был автоматически закрыт.
>>> fp.closed
# True

Если вы не используете ключевое слово with, то вам следует вызвать fp.close(), чтобы закрыть файл и немедленно освободить все системные ресурсы, используемые им. Если вы явно не закроете файл, сборщик мусора Python в конечном итоге уничтожит объект и закроет открытый файл для вас, но файл может оставаться открытым некоторое время. Другой риск заключается в том, что не закрытый файл может привести к нежелательному поведению, включая утечку ресурсов. Так что лучше всего убедиться, что ваш код ведет себя определенным образом, что уменьшает риск нежелательного поведения.

Правильный способ закрыть файл не используя инструкцию with это использовать блок try-finally:

>>> fp = open('filename')
>>> try:
...    # Дальнейшая обработка файлов идет здесь
...    read_data = fp.read()
>>> finally:
...    fp.close()

После закрытия объекта file object с помощью оператора with или вызова функции fp.close() в блоке try-finally попытки использовать объект file автоматически завершатся неудачей.

>>> fp.close()
>>> fp.read()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: I/O operation on closed file.