Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 164

100

100

56

>>> fout.close()

216

Глава 8. Данные должны куда-то попадать

Читаем бинарные файлы

с помощью функции read()

Это просто: все, что вам нужно, — открыть файл в режиме 'rb':

>>> fin = open('bfile', 'rb')

>>> bdata = fin.read()

>>> len(bdata)

256

>>> fin.close()

Закрываем файлы автоматически

с помощью ключевого слова with

Если вы забудете закрыть за собой файл, его закроет Python после того, как будет

удалена последняя ссылка на него. Это означает, что, если вы откроете файл и не

закроете его явно, он будет закрыт автоматически по завершении функции. Но вы

можете открыть файл внутри длинной функции или даже основного раздела про-

граммы. Файл должен быть закрыт, чтобы все оставшиеся операции записи были

завершены.

У Python имеются менеджеры контекста для очистки объектов вроде открытых

файлов. Вы можете использовать конструкцию with выражение as переменная:

>>> with open('relativity', 'wt') as fout:

... fout.write(poem)

...

Вот и все. После того как блок кода, расположенный под менеджером контекста

(в этом случае одна строка), завершится (или нормально, или путем генерации

исключения), файл будет закрыт автоматически.

Меняем позицию

с помощью функции seek()

По мере чтения и записи Python отслеживает ваше местоположение в файле. Функ-

ция tell() возвращает ваше текущее смещение от начала файла в байтах. Функция

seek() позволяет вам перейти к другому смещению в файле. Это значит, что вам

не обязательно читать каждый байт файла, чтобы добраться до последнего, — вы

можете использовать функцию seek(), чтобы сместиться к последнему байту и счи-

тать его.

Для примера воспользуемся 256-байтным бинарным файлом 'bfile', который

мы создали ранее:

>>> fin = open('bfile', 'rb')

>>> fin.tell()

0

Ввод информации в файлы и ее вывод из них

217

Используем функцию seek(), чтобы перейти к предпоследнему байту файла:

>>> fin.seek(255)

255

Считаем все данные от текущей позиции до конца файла:

>>> bdata = fin.read()