Простой Python. Современный стиль программирования (Любанович) - страница 120

>>>> poem = ''

>>>> fin = open('relativity', 'rt')

>>>> while True:

>…·····line = fin.readline()

>…·····if not line:

>…·········break

>…·····poem += line

>…

>>>> fin.close()

>>>> len(poem)

>150

Для текстового файла даже пустая строка имеет длину, равную 1 (символ новой строки), такая строка будет считаться True. Когда весь файл будет считан, функция readline() (как и функция read()) возвратит пустую строку, которая будет считаться False.

Самый простой способ считать текстовый файл — использовать итератор. Он будет возвращать по одной строке за раз. Этот пример похож на предыдущий, но кода в нем меньше:

>>>> poem = ''

>>>> fin = open('relativity', 'rt')

>>>> for line in fin:

>…·····poem += line

>…

>>>> fin.close()

>>>> len(poem)

>150

Во всех предыдущих примерах в результате получалась одна строка poem. Функция readline() считывает по одной строке за раз и возвращает список этих строк:

>>>> fin = open('relativity', 'rt')

>>>> lines = fin.readlines()

>>>> fin.close()

>>>> print(len(lines), 'lines read')

>5 lines read

>>>> for line in lines:

>…·····print(line, end='')

>…

>There was a young lady named Bright,

>Whose speed was far faster than light;

>She started one day

>In a relative way,

>And returned on the previous night.>>>

Мы указали функции print() не добавлять автоматически символы новой строки, поскольку первые четыре строки сами их имеют. В последней строке этого символа не было, что заставило интерактивное приглашение появиться сразу после последней строки.

Записываем данные в бинарный файл с помощью функции write()

Если вы включите символ 'b' в строку режима, файл будет открыт в бинарном режиме. В этом случае вы вместо чтения и записи строк будете работать с байтами.

У нас под рукой нет бинарного стихотворения, поэтому мы просто сгенерируем 256 байтовых значений от 0 до 255:

>>>> bdata = bytes(range(0, 256))

>>>> len(bdata)

>256

Откроем файл для записи в бинарном режиме и запишем все данные сразу:

>>>> fout = open('bfile', 'wb')

>>>> fout.write(bdata)

>256

>>>> fout.close()

И вновь функция write() возвращает количество записанных байтов.

Как и в случае с текстом, вы можете записывать бинарные данные фрагментами:

>>>> fout = open('bfile', 'wb')

>>>> size = len(bdata)

>>>> offset = 0

>>>> chunk = 100

>>>> while True:

>…·····if offset > size:

>…··········break

>…·····fout.write(bdata[offset: offset+chunk])

>…·····offset += chunk

>…

>100

>100

>56

>>>> fout.close()

Читаем бинарные файлы с помощью функции read()

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

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

>>>> bdata = fin.read()

>>>> len(bdata)

>256

>>>> fin.close()

Закрываем файлы автоматически с помощью ключевого слова with