Шаг 160.
Основы языка Python.
Работа с файлами и каталогами. Открытие файла (окончание)

    На этом шаге мы рассмотрим остальные параметры функции open().

    Необязательный параметр mode в функции open() может принимать следующие значения:


   Примечание. Поддержка последних двух режимов появилась в Python 3.3.

    После указания режима может следовать модификатор: '

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

    На следующем шаге мы рассмотрим методы для работы с файлами.




Предыдущий шаг Содержание Следующий шаг