Дескрипторы файлов: продолжение
Поскольку проблемы переносимости были (и остаются) очень серьезными, было принято решение определенно решить проблему таким образом, чтобы не привлекать внимание разработчика.
Это было сделано на уровне классов, которые отвечают за чтение и запись символов в и из потока. Это работает следующим образом:
- когда поток открыт и рекомендуется, чтобы данные в связанном файле были обработаны как текст (или таких рекомендаций вообще нет), он переключается в текстовый режим;
- во время чтения/записи строк из/в связанный файл ничего особенного не происходит в среде Unix, но когда те же операции выполняются в среде Windows, этот процесс называется переводом символов новой строки, он происходит, когда Вы читаете строку из файла, каждая пара символов
\r\n
заменяется одним символом\n
, и наоборот; во время операций записи каждый символ\n
заменяется парой символов\r\n
; - механизм полностью прозрачен для программы, который можно записать так, как если бы он предназначался только для обработки текстовых файлов Unix/Linux; исходный код, работающий в среде Windows, также будет работать правильно;
- когда поток открыт и рекомендуется это сделать, его содержимое принимается как есть, без преобразования - байты не добавляются и не опускаются.
Открытие потока
Открытие потока выполняется функцией, которая может быть вызвана следующим образом:
stream = open(file, mode = 'r', encoding = None)
Давайте проанализируем ее:
- имя функции (
open
) говорит само за себя; если открытие прошло успешно, функция возвращает объект потока; в противном случае возникает исключение (например, FileNotFoundError, если файл, который Вы собираетесь прочитать, не существует); - первый параметр функции (
file
) указывает имя файла, который будет связан с потоком; - второй параметр (
mode
) указывает режим открытия, используемый для потока; это строка, заполненная последовательностью символов, и у каждого из них есть свое особое значение (более подробная информация скоро); - третий параметр (
encoding
) указывает тип кодировки (например, UTF-8 при работе с текстовыми файлами); - открытие должно быть самой первой операцией, выполняемой в потоке.
Примечание: аргументы режима и кодирования могут быть опущены - тогда принимаются значения по умолчанию. Режим открытия по умолчанию - чтение в текстовом режиме, а кодировка по умолчанию зависит от используемой платформы.
Давайте теперь представим Вам самые важные и полезные режимы открытия. Готовы?