Основные тезисы
1. Файл должен быть открыт, прежде чем он может быть обработан программой, и должен быть закрыт по завершении обработки.
Открытие файла связывает его с потоком, который является абстрактным представлением физических данных, хранящихся на носителе. Способ обработки потока называется режимом открытия. Существуют три режима открытия:
- read mode – разрешены только операции чтения;
- write mode – разрешены только операции записи;
- update mode – разрешены как запись, так и чтение.
2. В зависимости от физического содержимого файла для обработки файлов могут использоваться разные классы Python. В общем, BufferedIOBase может обрабатывать любой файл, а TextIOBase - это специализированный класс, предназначенный для обработки текстовых файлов (т.е. Файлов, содержащих видимые человеку тексты, разделенные на строки с использованием новых -строчные маркеры). Таким образом, потоки можно разделить на бинарные и текстовые.
3. Для открытия файла используется следующий синтаксис функции open():
open(file_name, mode=open_mode, encoding=text_encoding)
Вызов создает объект потока и связывает его с файлом с именем file_name, используя указанный open_mode и задав указанный text_encoding, либо вызывает исключение в случае ошибки.
4. При запуске программы уже открыты три предопределенных потока:
sys.stdin– стандартный ввод;sys.stdout– стандартный вывод;sys.stderr– стандартный вывод ошибок.
4. Объект исключения IOError, создаваемый при сбое любых файловых операций (включая операции открытия), содержит свойство с именем errno, которое содержит код завершения неудачного действия. Используйте это значение для диагностики проблемы.
Упражнение 1
Как Вы закодируете значение аргумента функции open() mode, если Вы собираетесь создать новый текстовый файл, чтобы заполнить его только статьей?
Упражнение 2
Что означает значение, представленное errno.EACCES?
Упражнение 3
Каков ожидаемый вывод следующего кода, если предположить, что файла с именем file не существует?
import errno
try:
stream = open("file", "rb")
print("exists")
stream.close()
except IOError as error:
if error.errno == errno.ENOENT:
print("absent")
else:
print("unknown")