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

Функция open() в Python, открывает файл на чтение/запись

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

Синтаксис:

fp = open(file, mode='r', buffering=-1, encoding=None,
          errors=None, newline=None, closefd=True, opener=None)

Параметры:

  • file - абсолютное или относительное значение пути к файлу или файловый дескриптор открываемого файла.
  • mode - необязательно, строка, которая указывает режим, в котором открывается файл. По умолчанию 'r'.
  • buffering - необязательно, целое число, используемое для установки политики буферизации.
  • encoding - необязательно, кодировка, используемая для декодирования или кодирования файла.
  • errors - необязательно, строка, которая указывает, как должны обрабатываться ошибки кодирования и декодирования. Не используется в -бинарном режиме
  • newline - необязательно, режим перевода строк. Варианты: None, '\n', '\r' и '\r\n'. Следует использовать только для текстовых файлов.
  • closefd - необязательно, bool, флаг закрытия файлового дескриптора.
  • opener - необязательно, пользовательский объект, возвращающий открытый дескриптор файла.

Возвращаемое значение:

Описание:

Функция open() открывает файл для чтения или записи при помощи файлового потока. Если файл не может быть открыт, бросается исключение OSError.

Функция возвращает файловый объект, который имеет методы, позволяющие читать и записывать информацию различными способами.

Аргумент file - это строка, определяющая абсолютное или относительное расположение открываемого файла в файловой системе или целочисленный файловый дескриптор файла. Если задан файловый дескриптор, он закрывается, когда возвращаемый файловый поток закрывается, если для closefd не установлено значение False.

Изменено в Python 3.6: В аргумент file добавлена ​​поддержка приема объектов, реализующих os.PathLike. Обратите внимание, что модуль pathlib реализует протокол os.PathLike.

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

Значения аргумента mode:

  • r - открывает файл только для чтения,
  • w - открыт для записи (перед записью файл будет очищен),
  • x - эксклюзивное создание, бросается исключение FileExistsError, если файл уже существует.
  • a - открыт для добавления в конец файла (на некоторых Unix-системах пишет в конец файла вне зависимости от позиции курсора)
  • + - символ обновления (чтение + запись).
  • t - символ текстового режима.
  • b - символ двоичного режима (для операционных систем, которые различают текстовые и двоичные файлы).

Режим по умолчанию 'r', открывает файл только для чтения текста, синоним 'rt'. Режимы 'r+' и 'r+b' открывают файл и устанавливают курсор на начало файла, запись в файл начинается с места остановки курсора при его чтении перед записью. Если файл перед записью не читался то запись осуществляется в начало файла. Режимы 'w' и 'wb' создают новый файл или открывают существующий файл только для записи, с последующей его очисткой (стирает все перед записью). У режимов 'w+' и 'wb+' поведение такое же как в предыдущем случае, только если не закрывать файл после записи, его еще можно потом прочитать.

Варианты использования режимов:

  • 'r' - Открывает файл только для чтения. Указатель файла помещается в начале файла. Это режим "по умолчанию".
  • 'rb' - Открывает файл в бинарном режиме только для чтения. Указатель файла помещается в начале файла. Это режим "по умолчанию".
  • 'r+' - Открывает файл для чтения и записи. Указатель файла помещается в начало файла.
  • 'rb+' - Открывает файл в бинарном режиме для чтения и записи. Указатель файла помещается в начале файла. Это режим "по умолчанию".
  • 'w' - Открывает файл только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.
  • 'wb' - Открывает файл в бинарном режиме только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.
  • 'w+' - Открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создается новый файл для чтения и записи.
  • 'wb+' - Открывает файл в бинарном режиме для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создается новый файл для чтения и записи.
  • 'a' - Открывает файл для добавления. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
  • 'ab' - Открывает файл в бинарном режиме для добавления. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
  • 'a+' - Открывает файл для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
  • 'ab+' - Открывает файл в бинарном режиме для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.

Python различает двоичный и текстовый ввод/вывод. Файлы, открытые в двоичном режиме, возвращают содержимое в виде bytes объектов без какого-либо декодирования. В текстовом режиме (по умолчанию или когда 't' включен в аргумент mode) содержимое файла возвращается как строка байтов, которые были сначала декодированы с использованием кодировки, используемой системой по умолчанию или с использованием переданного аргумента encoding.

Аргумент buffering - необязательное целое число, используемое для установки политики буферизации.

  • 0 - отключить буферизацию, только для бинарного режима;
  • 1 - построчная буферизация, только для текстового режима;
  • int число > 1 - размер буфера в байтах.
  • -1 - по умолчанию.

У текстовых файлов, если buffering не задан, используется построчная буферизаця. Двоичные файлы буферизируются кусками фиксированного размера. Этот размер определяется эвристикой, пытающейся определить размер блока устройства, на котором находится файл, в случае неудачи использует io.DEFAULT_BUFFER_SIZE. Для многих систем буфер равен 4096 или 8192 байт.

Аргумент encoding - это имя кодировки, используемой для декодирования или кодирования файла. Это аргумент следует использовать только в текстовом режиме. Кодировка по умолчанию зависит от платформы, но может использоваться любая кодировка текста, поддерживаемая Python.

Аргумент error является необязательным и указывает как должны обрабатываться ошибки кодирования и декодирования. Следует использовать только для текстовых файлов.

Доступны стандартные обработчики ошибок:

  • 'strict' - бросает исключение ValueError, если есть ошибка кодирования. Значение по умолчанию None имеет тот же эффект.
  • 'ignore' - игнорирует ошибки. Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.
  • 'replace' - вставляет символ ? на место непрочитанных символов, ввиду их отсутствия в используемой кодировке.
  • 'surrogateescape' - любые некорректные байты будут представлены как символы Юникода в диапазоне от U+DC80 до U+DCFF. Эти символы, при обратной операции кодирования будут возвращаться в те же байты. Полезно для обработки файлов в неизвестной кодировке.
  • 'xmlcharrefreplace' - поддерживается только при записи в файл. Символы, не поддерживаемые кодировкой, заменяются соответствующей ссылкой на символ XML.
  • 'backslashreplace' - заменяет искаженные данные на escape-последовательности Python с обратной косой чертой.
  • 'namereplace' - поддерживается только при записи, заменяет не поддерживаемые символы на \N{...} escape-последовательности.

Аргумент newline контролирует работу режима новой строки. Работает только с текстовым режимом. Допустимые аргументы: None, '', '\n', '\r' и '\r\n'.

Это работает следующим образом:

  • Чтение файла:
    • если аргумент newline=None или не указан, то символами окончания строк '\n', '\r' или '\r\n' на выходе преобразуются в разделитель строки '\n'.
    • если newline='', то получим результат с вырезанными символами окончания строк '\n', '\r' или '\r\n', то есть файл прочитается как одна большая строка.
    • если newline='\n', то в результате чтения функция open() уберет только символ \n из результата, если newline='\r', то только \r, если newline='\r\n', то только сочетание '\r\n' не будет учитываться.
  • При записи файла:
    • если аргумент newline=None или не указан, то символы окончания строк \n будут переведены в разделители строк, которые система использует по умолчанию;
    • если newline='' или newline='\n', то символы окончания строк \n переводится в разделители строк не будут. В файл запишется одна большая строка.
    • если newline='\r', то в результате записи функция open() сохранит значение \r в качестве разделителя строк, если newline='\r\n', то запишется сочетание '\r\n'.

Аргумент closefd по умолчанию True. Если аргумент closefd=False и вместо имени файла был задан его дескриптор, то при закрытии файла функцией open(), базовый дескриптор файла будет оставаться открытым. Если задано имя файла, closefd должно быть True (по умолчанию), иначе возникнет ошибка.

Необязательный аргумент opener (по умолчанию None), пользовательский объект поддерживающий вызов, который следует использовать для открытия файла. Этот объект получая на входе file и flags, должен возвращать открытый дескриптор файла.

Дополнительно смотрите функцию os.open(), которая открывает файл и возвращает его файловый дескриптор. Вновь созданный дескриптор не наследуется .

В следующем примере используется параметр dir_fd функции os.open(), чтобы открыть файл относительно данного каталога:

>>> import os
>>> dir_fd = os.open('/some/dir', os.O_RDONLY)
>>> def opener(path, flags):
...     return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('test.txt', 'w', opener=opener) as f:
...     print('This will be written to /some/dir/test.txt', file=f)
...
>>> os.close(dir_fd)  # не забывайте закрыть файловый дескриптор

Тип файлового объекта, возвращаемого функцией open(), зависит от режима. Когда используется open(), чтобы открыть файл в текстовом режиме 'w', 'r', 'wt', 'rt' и т. д., она возвращает подкласс io.TextIOBase, в частности io.TextIOWrapper. При использовании для открытия файла в двоичном режиме с буферизацией возвращаемый класс является подклассом io.BufferedIOBase.

Итоговый класс меняется в зависимости от операции:

  • в режиме чтения двоичных файлов он возвращает io.BufferedReader;
  • в двоичном режиме записи и в двоичном режиме добавления он возвращает io.BufferedWriter;
  • в режиме чтения/записи - io.BufferedRandom.

Когда отключена буферизация, исходный поток возвращает подклассы io.RawIOBase, io.FileIO.

Примеры чтения из файла и записи в файл.

Чтение и вывод на печать сразу всего файла:

f = open('demofile.txt', 'r')
print(f.read())
f.close()  # не забывайте закрыть файл

Чтение всего файла и вывод на печать построчно:

f = open('demofile.txt', 'r')
for line in f:
  print(line)
f.close() # не забывайте закрыть файл

Создадим файл newfile.txt и запишем в него строку. Если файл с таким именем уже существует, то данные внутри файла сотрутся.

f = open('newfile.txt', 'w')
f.write('Это единственная строка в файле\n')
f.close() # не забывайте закрыть файл

Использование менеджера контекста для чтения/записи в файл.

Открываем файл на запись с помощью менеджера контекста и пишем данные в конец файла.

with open('demofile.txt', 'a') as f:
    f.write('Привет Мир\n')

# здесь закрывать файл не надо, менеджер контекста сделает это сам...