Основные тезисы
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")