Чтение из файлов

chtenie iz fajlov Инструменты для работы с файлами и каталогами

Чтение данных из внешних файлов осуществляется столь же просто, как запись, но при этом доступно большее количество методов, позволяющих загружать данные в разнообразных режимах. Входные текстовые файлы открываются с флагом режима r(от «read» — читать) либо вообще без флага режима (“r— значение по умолчанию, и параметр часто пропускается). После открытия текстового файла его строки можно читать с помощью метода readlines:

C:\temp> python

>>> file = open(’data.txt’) # открыть входной файл: ‘ г’ — по умолчанию

>>> lines = file.readlines() # прочитать в список строк

>>> for line in lines: # НО! использовать итератор файла!

print(line, end=’’) # строки оканчиваются символом ‘\n

Hello file world!

Bye file world.

Метод readlines загружает содержимое файла в память целиком и передает его сценарию в виде списка строк, который можно обойти в цикле. В действительности существует много способов чтения входного файла:

file.read()

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

file.read(N)

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

file.readline()

Читает содержимое файла до ближайшего символа \n и возвращает строку.

file.readlines()

Читает файл целиком и возвращает список строк.

Попробуем воспользоваться этими методами для чтения файлов, строк и символов из файлов — вызов метода seek(0) перед каждой попыткой чтения переустанавливает текущую позицию чтения в начало файла (подробнее об этом методе рассказывается чуть ниже):

>>> file.seek(0) # перейти в начало файла

>>> file.read() # прочитать в строку файл целиком

‘Hello file world!\nBye file world.\n’

>>> file.seek(0)

>>> file.readlines() # прочитать файл целиком в список строк

[‘Hello file world!\n’, ‘Bye file world.\n’]

>   >> file.seek(0)

>   >> file.readline() # читать по одной строке

‘Hello file world!\n’

>   >> file.readline()

‘Bye file world.\n’

>   >> file.readline() # конец файла — возвращается пустая строка

‘’

>   >> file.seek(0) # прочитать N (или оставшиеся) символы/байты

>   >> file.read(1), file.read(8) # конец файла — возвращается пустая строка (‘H’, ‘ello fil’)

Все эти методы ввода позволяют определить, сколько данных должно быть получено. Ниже приводится несколько практических правил выбора метода:

     read() и readlines() загружают в память сразу весь файл. Это удобно, когда желательно получить содержимое файла, написав более короткий программный код. Кроме того, эти методы действуют очень быстро, но для больших файлов их применение накладно: загрузка гигабайтных файлов — обычно не самое лучшее решение (а кроме того, на некоторых компьютерах — просто невозможное).

     С другой стороны, вызовы readline() и read(N) возвращают лишь часть файла (очередную строку или блок из N символов или байтов), поэтому они надежнее для потенциально больших файлов, но не так удобны и обычно работают медленнее. Оба метода возвращают пустую строку по достижении конца файла. Если скорость для вас важна, а ваши файлы не слишком велики, методы read и readlines могут оказаться лучшим выбором.

     Кроме того, смотрите обсуждение итераторов файлов в следующем разделе. Как мы увидим, итераторы объединяют в себе удобство метода readlines() и экономное отношение к памяти метода readline(), и на сегодняшний день являются наиболее предпочтительным способом построчного чтения текстовых файлов.

Часто встречающийся здесь вызов seek(0) означает «вернуться в начало файла». В нашем примере этот вызов является альтернативой повторному открытию файла перед очередной попыткой. Все операции чтения и записи в файлах происходят в текущей позиции. Обычно при открытии текущая позиция в файле устанавливается со смещением 0 и перемещается вперед по мере передачи данных. Метод seek просто позволяет переместиться в новую позицию для очередной операции передачи данных. Подробнее об этом методе будет рассказываться ниже, когда мы перейдем к исследованию возможности произвольного доступа к файлам.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий