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