На этом шаге мы рассмотрим остальные параметры функции open().
Необязательный параметр mode в функции open() может принимать следующие значения:
После указания режима может следовать модификатор: '
Для примера создадим файл file.txt и запишем в него две строки:
>>> f = open (r"file.txt", "w") # Открываем файл на запись >>> f.write ("String1\nString2")# Записываем две строки в файл 15 >>> f.close() # Закрываем файл
Поскольку мы указали режим w, то если файл не существует, он будет создан, а если существует, то будет перезаписан.
Теперь выведем содержимое файла в бинарном и текстовом режимах:
>>> # Бинарный режим (символ \r остается) >>> with open (r"file.txt", "rb") as f: for line in f: print(repr(line)) b'String1\r\n' b'String2' >>> # Текстовый режим (символ \r удаляется) >>> with open (r"file.txt", "r") as f: for line in f: print(repr(line)) 'String1\n' 'String2'
Для ускорения работы производится буферизация записываемых данных. Информация из буфера записывается в файл полностью только в момент закрытия файла или после вызова функции или метода flush(). В необязательном параметре buffering можно указать размер буфера. Если в качестве значения указан 0, то данные будут сразу записываться в файл (значение допустимо только в бинарном режиме). Значение 1 используется при построчной записи в файл (значение допустимо только в текстовом режиме), другое положительное число задает примерный размер буфера, а отрицательное значение (или отсутствие значения) означает установку размера, применяемого в системе по умолчанию. По умолчанию текстовые файлы буферизуются построчно, а бинарные - частями, размер которых интерпретатор выбирает самостоятельно в диапазоне от 4096 до 8192 байтов.
При использовании текстового режима (задается по умолчанию) при чтении производится попытка преобразовать данные в кодировку Unicode, а при записи выполняется обратная операция - строка преобразуется в последовательность байтов в определенной кодировке. По умолчанию назначается кодировка, применяемая в системе. Если преобразование невозможно, то возбуждается исключение. Указать кодировку, которая будет использоваться при записи и чтении файла, позволяет параметр encoding. Для примера запишем данные в кодировке UTF-8:
>>> f = open(r"file.txt","w", encoding="utf-8") >>> f.write ("Строка") # Записываем строку в файл 6 >>> f.close() # Закрываем файл
Для чтения этого файла следует явно указать кодировку при открытии файла:
>>> with open (r"file.txt", "r", encoding="utf-8") as f: for line in f: print(line) Строка
При работе с файлами в кодировках UTF-8, UTF-16 и UTF-32 следует учитывать, что в начале файла могут присутствовать служебные символы, называемые сокращенно BOM (Byte Order Mark - метка порядка байтов). Для кодировки UTF-8 эти символы являются необязательными, и в предыдущем примере они не были добавлены в файл при записи. Чтобы символы были добавлены, в параметре encoding следует указать значение utf-8-sig. Запишем строку в файл в кодировке UTF-8 с ВОМ:
>>> f = open(r"file.txt","w", encoding="utf-8-sig") >>> f.write ("Строка") # Записываем строку в файл 6 >>> f.close() # Закрываем файл
Теперь прочитаем файл с разными значениями в параметре encoding:
>>> with open (r"file.txt", "r", encoding="utf-8") as f: for line in f: print(repr(line)) '\ufeffСтрока' >>> with open (r"file.txt", "r", encoding="utf-8-sig") as f: for line in f: print(repr(line)) Строка
В первом примере мы указали значение utf-8, поэтому маркер ВОМ был прочитан из файла вместе с данными. Во втором примере указано значение utf-8-sig, поэтому маркер ВОМ не попал в результат. Если неизвестно, есть ли маркер в файле, и необходимо получить данные без маркера, то следует всегда указывать значение utf-8-sig при чтении файла в кодировке UTF-8.
Для кодировок UTF-16 и UTF-32 маркер ВОМ является обязательным. При указании значений utf-16 и utf-32 в параметре encoding обработка маркера производится автоматически. При записи данных маркер автоматически вставляется в начало файла, а при чтении он не попадает в результат. Запишем строку в файл, а затем прочитаем ее из файла:
>>> with open (r"file.txt", "w", encoding="utf-16") as f: f.write("Строка") 6 >>> with open (r"file.txt", "r", encoding="utf-16") as f: for line in f: print(repr(line)) Строка
При использовании значений utf-16-le, utf-16-be, utf-32-le и utf-32-be маркер ВОМ необходимо самим добавить в начало файла, а при чтении удалить его.
В параметре errors можно указать уровень обработки ошибок. Возможные значения:
Параметр newline задает режим обработки символов конца строк. Поддерживаемые им значения таковы:
На следующем шаге мы рассмотрим методы для работы с файлами.